大家好,欢迎来到IT知识分享网。
g++常用参数
编译选项
-g
生成调试信息,该程序可以被调试器调试
-fPIC
PIC: position independent code。
生成位置无关的代码(一般用于动态库.so)。
共享对象可能会被不同的进程加载到不同的位置上,如果共享对象中的指令使用了绝对地址,外部模块地址,那么在共享对象被加载时就必须根据相关模块的加载位置对这个地址做调整,也就是修改这些地址,让它在对应进程中能正确访问。
-w
关闭编译时的警告,也就是编译后不显示任何warning
-D 宏定义
路径相关
-I(大写的i)
-I参数是用来指定头文件所在目录。
/usr/include目录一般是不用指定的,gcc知道去那里找,但是如果头文件不在/usr/include里我们就要用-I参数指定了。
-L(大写的l)
-L参数跟着的是库文件所在的目录。
-l(小写的L)
-l参数就是用来指定程序要链接的库,-l参数紧接着就是库名。
编译过程
g++ -E 预编译
预编译,将.c文件转化为.i文件
ar命令创建静态库.a
ar crv libapi.a api.o #生成静态库 libapi.a g++ main.cpp -lapi -o output #生成output可执行文件,链接静态库
g++创建动态库.so
g++ -shared -fPIC -o libapi.so api.o #生成libapi.so 动态库 g++ main.cpp -lapi -o output #生成output可执行文件,链接动态库
MinGW:GCC编译C语言,生成和调用dll
gcc -shared -o add.dll add.c gcc -o main.exe main.c add.dll main.exe gcc -o a.exe .\main.c -lglut32 -lopengl32
使用gcc命令编译C代码
gcc -g -o test test.c
gdb test
gdb断点和单步运行
首先列出源码,命令:list,
然后在第8行设置断点,命令:break 8,
然开始运行程序,命令:run
程序会在断点处停下,继续下一步:next或n
命令 简写 描述
next n 下一步,不会进入函数内部,相当于vs调试的F10
step s 下一步,如果是函数调用,会进入函数内部,相当于vs调试的F11
continue c 继续执行,直到下一个断点为止,相当于vs调试的F5
help 查看命令帮助,具体命令查询在gdb中输入help + 命令,简写h
run 重新开始运行文件(run-text
start 单步执行,运行程序,停在第一执行语句
list 查看原代码(list-n,从第n行开始查看代码。list+ 函数名
set 设置变量的值
next 单步调试(逐过程,函数直接执行),简写n
step 单步调试(逐语句
backtrace 查看函数的调用的栈帧和层级关系,简写bt
frame 切换函数的栈帧,简写f
info 查看函数内部局部变量的数值,简写i
finish 结束当前函数,返回到函数调用点
continue 继续运行,简写c
print 打印值及地址,简写p
quit 退出gdb,简写q
break+num 在第num行设置断点,简写b
info breakpoints 查看当前设置的所有断点
delete breakpoints num 删除第num个断点,简写d
display 追踪查看具体变量值
undisplay 取消追踪观察变量
watch 被设置观察点的变量发生修改时,打印显示
i watch 显示观察点
enable breakpoints 启用断点
disable breakpoints 禁用断点
run argv[1] argv[2] 调试时命令行传参
wingw编译的常用命令
头文件搜索路径:
“ ”引用的头文件:
1)先搜索当前目录
2)搜索 -I指定目录
3)收缩gcc的环境变量
CPATH:gcc和g++都适用
C_INCLUDE_PATH :gcc使用的环境变量
CPLUS_INCLUDE_PATH: g++使用的环境变量
windows中通过set CPATH=路径 设置临时的环境变量;通过windows编辑系统环境变量能够设置永久的环境变量,重启后生效
4) mingw内定的目录(包括常用的标准库头文件)
<>引用的头文件: 除了不搜索当前目录,其他都是一样的。自己写的头文件一般用“ ”,库的头文件一般用<>。
编译链接动态库搜索路径:
1)-L指定的路径
2)gcc环境变量指定的路径
LIBRARY_PATH
3) mingw中内定的目录(如c/c++标准库的动态库)
运行时动态库搜索路径:
1).exe所在目录
2)环境变量PATH
set PATH=%PATH%;动态库路径
3)mingw内定目录(链接标准库时gcc直接链接)
注意:通过实验LD_LIBRARY_PATH,-rpath在windows当中都不生效。要想在运行时不拷贝动态库,就要设置将动态库路径设置到PATH环境变量当中。
编译静态库
1)生成.o:gcc *.c -c
2) 将生成的.o文件打包:ar rcs static.lib *.o
3)更新符号表:randlib 静态库
编译动态库
1)生成.o:gcc *.c -c -fPIC (-fPIC编译位置独立的代码)
2)生成.dll和.lib,-shared表明生成动态库,-wl后面的内容是ld参数,需要传给ld,–out-implib生成动态库的导出库,-out-def生成.def文件(也可以不用生成)
gcc -shared -o shared.dll *.o -Wl,–out-implib,shared.lib,–out-def,shared.def
注意:-static选项用于在链接时优先选择静态库,比如链接的目录中同时有静态库和动态库,就会直接链接静态库。
.bat的一些常用命令:
del:删除文件
md:创建目录
copy:复制文件
set:设置变量
cd:切换目录
%~dp0:当前目录
%PATH%:获取PATH变量当中的值
创建函数:
:函数名(函数开始)
goto eof (函数结束)
调用函数:
call:函数名 (调用函数要在创建函数的开始位置)
@echo off for %%d in (lib,include,bin) do ( if exist %%d ( cd %%d del /q/a/f *.* cd .. ) else ( md %%d ) ) if "%1" == "-s" ( call:build_static ) else if "%1" == "-r" ( call:build_shared ) else if "%1" == "-a" ( call:build_static call:build_shared call:build_exe ) else ( call:help ) @REM complie static lib :build_static set STATIC_SRC= %~dp0src\static\*.* set STATIC_INCLUDE= %~dp0src\static\ set STATIC_LIB_NAME=add.lib cd ./lib g++ %STATIC_SRC% -c -I %STATIC_INCLUDE% ar rcs %STATIC_LIB_NAME% *.o ranlib %STATIC_LIB_NAME% del /q/a/f *.o cd .. copy %~dp0src\static\multi.h %~dp0include\ goto:eof @REM complie shared lib :build_shared set SHARED_SRC=%~dp0src\shared\*.* set SHARED_INCLUDE=%~dp0src\shared\ set SHARED_LIB_NAME=multi cd ./lib g++ %SHARED_SRC% -c -I %SHARED_INCLUDE% -fPIC -DEXPORTS g++ -shared -o %SHARED_LIB_NAME%.dll *.o -I %SHARED_INCLUDE% -DEXPORTS -Wl,--out-implib,%SHARED_LIB_NAME%.lib,--output-def,multi.def del /q/a/f *.o cd .. copy %~dp0src\shared\add.h %~dp0include\ goto:eof @REM complie excutable :build_exe set MAIN_SRC=%~dp0src\main\*.cpp set MAIN_NAME=app set INCLUDE=%~dp0include\ set LIB_DIR=%~dp0lib\ cd ./bin set PATH=%PATH%;C:\Users\Administrator\Desktop\gcc_testa\lib g++ %MAIN_SRC% -o %MAIN_NAME% -L %LIB_DIR% -lmulti -ladd -DDEBUG -I %INCLUDE% cd .. goto:eof :help echo -s build_static echo -r build_shared echo -a build_exe echo -c clean echo -* help goto:eof
Mingw和visual c++编译的区别
mingw32-make
Mingw在导出动态库时加不加_declspec(dllexport)这个都能够导出,而visual c++必须加上这个关键字才能导出。
Mingw不加_declspec(dllexport)关键字的符号表:
EXPORTS
_Z3addii @1
_Z3subii @2
_Z9print_addi @3
_Z9print_subi @4
Mingw加上_declspec(dllexport)关键字的符号表:
EXPORTS
_Z3addii @1
_Z3subii @2
可见:加上关键字导出库的符号表就只有加上关键字的函数,而不加关键字导出库的符号表是动态库里面的所有函数。
visual c++导出的函数表
?add@@YAHH@Z
?sub@@YAHH@Z
可见:visual c++和MinGw g++导出的函数表是不相同的,每个编译器对函数名称都做了特殊处理,所以不同编译器编译的库不能够相互使用;同时gcc和g++编译也对不同函数名进行了不同的处理,在cpp文件中也不能直接是有c文件中的函数。
cpp中要使用c语言,则要将使用的c函数进行如下声明,这样cpp才能知道函数是按照c语言进行编译的。
#ifdef __cplusplus extern "C" { #endif c语言中的函数定义; #ifdef __cplusplus } #endif
MingW中的gcc编译选项和linux下面的编译大体相同,只是windows编译的脚本是.bat文件,linux下编译的脚本是shell脚本。Mingw在编译动态库的时候不用_declspec(dllexport)也能导出动态库,为了windows平台的统一,在编译windows平台下的代码最好都加上_declspec(dllexport)关键字
cmake -version
cmake_minimum_required(VERSION 3.0) project(Hello) aux_source_directory(./src DIR_SRCS) add_executable(${PROJECT_NAME} ${DIR_SRCS})
cd build # 目的是cmake构建出来的临时文件放这个文件夹 cmake -G "Unix Makefiles" .. Cmake命令行使用: -G 指明生成的Makefile格式 -D 添加参数 -S 指明源码位置 -B 指明输出路径 例如: cmake -G “MinGW Makefiles” -S “源码路径” -B “输出路径” 或者 cmake -G “MinGW Makefiles” -D CMAKE_TOOLCHAIN_FILE=“编译工具链路径” -S “源码路径” -B “输出路径” 注意:Cmake是不支持中文的,无论是GUI还是命令行,都严禁出现中文字符.
编译
执行 mingw32-make 命令
│ CMakeLists.txt │ ├─build │ ├─examples │ test_api.cpp │ ├─include │ └─detectionapi │ DetectionApi.h │ ├─lib │ libopencv_calib3d450.dll │ libopencv_core450.dll │ └─src DetectionApi.cpp
# 最低CMake版本要求 cmake_minimum_required(VERSION 3.9.0) # 设置版本信息 set(MY_PRODUCT_NUMBER 1) set(MY_PRODUCT_VERSION 0) string(TIMESTAMP COMPILE_TIME %m%d%H%M) set(build_time ${COMPILE_TIME}) set(MY_BUILD_NUMBER ${build_time}) # 项目名称,编译好dll或exe的名称 project(detection) # 设置C/C++标准 set(CMAKE_C_STANDARD 11) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) # 头文件路径 include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include/detectionapi) include_directories(../opencv/build/include) include_directories(../opencv/build/include/opencv2) # 枚举头文件 file(GLOB_RECURSE INCLUDES ${CMAKE_CURRENT_SOURCE_DIR}/include/detectionapi/*.h) # 指定引用的外部库的搜索路径 LINK_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/lib) # 枚举源文件 file(GLOB SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp) # 输出路径 set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin) # 链接 set(LINK_LIBS libopencv_calib3d450.dll libopencv_core450.dll ) # 生成dll库 ADD_LIBRARY(detectionapi SHARED ${INCLUDES} ${SOURCES} ${CMAKE_CURRENT_BINARY_DIR}/version.rc) #ADD_LIBRARY(detectionapi SHARED ${INCLUDES} ${SOURCES}) TARGET_LINK_LIBRARIES(detectionapi ${LINK_LIBS}) INSTALL(TARGETS detectionapi DESTINATION ${CMAKE_CURRENT_SOURCE_DIR}/lib) # 设置目标属性 SET_TARGET_PROPERTIES(detectionapi PROPERTIES LINKER_LANGUAGE C ARCHIVE_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/lib LIBRARY_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/lib RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/lib OUTPUT_NAME "DetectionApi" PREFIX "") # 生成可执行文件,仅用作测试 add_executable(detection examples/test_api.cpp ${INCLUDES}) TARGET_LINK_LIBRARIES(detection ${LINK_LIBS}) TARGET_LINK_LIBRARIES(detection ${PROJECT_BINARY_DIR}/lib/libDetectionApi.dll.a)
编译代码
# MinGW gcc -v # CMake cmake -version
#include<iostream> using namespace std; int main(){ cout<<"asdf"s<<endl; return 0; }
cmake_minimum_required (VERSION 3.8) project(test LANGUAGES C CXX) include_directories(${PROJECT_SOURCE_DIR}) set(CMAKE_CXX_FLAGS "-std=c++11") add_executable (test.cpp test1.cpp ...)
mkdir build cd build cmake –G "MinGW Makefiles" ../ make test
cmake_minimum_required(VERSION 3.12) project(MyProject) # Add your source files here set(SOURCES src/test_shared_ptr.cpp # Add your header files here # header1.h # header2.h ) # Add your header files here include_directories(G:/third_party/spdlog/include) # Add any additional libraries or dependencies here # find_package(...) # Set the executable target add_executable(MyProject ${SOURCES} ${HEADERS})
cd E:\pro\laser\laser_s\403A\s01\s001\build mingw32-make pause MyProject.exe pause cmake .. -G "MinGW Makefiles" pause mingw32-make pause
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/115654.html