库A依赖库B,将库B编译为静态库,将库A编译为动态库,在链接静态库时,经常会出现这样的错误:relocation R_X86_64_PC32 against symbol xxx can not be used when making a shared object; recompile with -fPIC,根本原因是在编译静态库时未加入可重定向选项。 在CMAKE中有多种添加
main: main.o liba.so gcc main.o -o main -L. -la main.o: main.c gcc -c main.c -o main.o liba.so: a.o gcc -shared a.o -o liba.so a.o: a.c gcc -fPIC -c .a.c -o a.o clean: rm *.o *.so main || true Makefile中也加入了一个clean目标,以便清理构建文件。使用ma...
set(CMAKE_C_FLAGS"-O3 -fopenmp -fPIC -Wno-deprecated -Wenum-compare -std=c++14") 针对c++编译器的 set(CMAKE_CXX_FLAGS "-O3 -fopenmp -fPIC -Wno-deprecated -Wenum-compare -std=c++14") 如何在cmakelists中加入-ldl编译选项 cmakelists.txt中,在增加可执行程序后增加TARGET_LINK_LIBRARIES eg: ...
add_compile_options(-march=native -O3 -fexceptions -pthread -fPIC) 这两种方式的区别在于: 代码语言:javascript 代码运行次数:0 运行 AI代码解释 add_compile_options命令添加的编译选项是针对所有编译器的(包括c和c++编译器),而set命令设置CMAKE_C_FLAGS或CMAKE_CXX_FLAGS变量则是分别只针对c和c++编译器的。
CMake为⾃⼰创建的库添加版本信息 1.Windows平台 Windows上的DLL是可以带上⽂件信息的,包括版本号、公司名等。如果你使⽤Visual Studio⾃带的动态链接库⼯程⽬标开发DLL,那么VS 会帮你把这些信息加到最后⽣成的DLL中;但是CMake不会,默认情况下通过add_library⽣成的DLL没有任何额外信息。那么在...
{BuildType}) # -fPIC 动态库必须的选项 ADD_COMPILE_OPTIONS(-fPIC) # 查找当前目录下的所有源文件 # 并将名称保存到 DIR_LIB_SRCS 变量 AUX_SOURCE_DIRECTORY(. DIR_LIB_SRCS) # 生成静态库链接库Dir1 #ADD_LIBRARY (Dir1 ${DIR_LIB_SRCS}) # 生成动态库 ADD_LIBRARY (Dir1 SHARED ${DIR_LIB_...
D_FORTIFY_SOURCE=2 -Wno-cpp") # set cmake args set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -I/usr/local/include -std=c++17 -Werror -Wall -Wno-deprecated-declarations -fPIC") set(CMAKE_EXPORT_COMPILE_COMMANDS ON) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OPTION_CXX_FLAGS}") #...
set(CMAKE_C_FLAGS“$ {CMAKE_C_FLAGS} -fPIC”) 设置C++编译器编译选项: set(CMAKE_CXX_FLAGS "-std=c++11 ${CMAKE_CXX_FLAGS}") 设置可执行文件输出目录: SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin) 设置库文件输出目录:
set(CMAKE_CXX_FLAGS "-O3 -fopenmp -fPIC -Wno-deprecated -Wenum-compare -std=c++14") 如何在cmakelists中加入-ldl编译选项 cmakelists.txt中,在增加可执行程序后增加TARGET_LINK_LIBRARIES eg: add_executable(xx ${ALL_F} ${WE_F}) TARGET_LINK_LIBRARIES(dl) ...
./configure CXXFLAGS=-fPIC make make install 然后再重新编译so,就通过了。 总结 如果在可执行程序中静态链接tcmalloc时,用默认参数编译tcmalloc就好了,无需带-fPIC参数, 但是在动态库(so)中静态链接tcmalloc,必须要用-fPIC重新编译tcmalloc。 本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。 原始发表...