我想用CMake生成一个共享库,即使我没有收到任何错误,也不会生成库(.so文件)。
这是我的CMakeLists.txt
cmake_minimum_required(VERSION 2.8)
project(myTest)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O0 -g3 -Wall -c -fmessage-length=0 -v -fPIC")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} --std=c++0x -O0 -g3 -Wall -c -fmessage-length=0 -fPIC")
add_definitions(-DLINUX=1)
include_directories(
${PROJECT_SOURCE_DIR}/public/include
# .. bunch of other include directories
)
link_directories("${PROJECT_SOURCE_DIR}/shared/lib")
file(GLOB_RECURSE SRC_FILES
"${PROJECT_SOURCE_DIR}/source/some1.cpp"
"${PROJECT_SOURCE_DIR}/source/some2.cpp"
)
add_library(myTest SHARED ${SRC_FILES})
当我创建构建目录时,从cmake生成make文件并执行默认的make目标,我没有看到任何错误。
[ 50%] Building CXX object /path/to/some1.cpp.o
[100%] Building CXX object /path/to/some2.cpp.o
Linking CXX shared library myTest.so
g++: warning: /path/to/some1.cpp.o: linker input file unused because linking not done
g++: warning: /path/to/some2.cpp.o: linker input file unused because linking not done
[100%] Built target myTest
但是当我在构建文件夹中看到so文件时,libmytest.so
没有生成。当我在整个系统上找到它时,它不会在其他任何地方生成。
令人惊讶的是,当我将库类型更改为STATIC
时,会生成libmytest.a
文件。我错过了一些明显的东西吗?
答案 0 :(得分:1)
错误发生在CMAKE_C_FLAGS
和CMAKE_CXX_FLAGS
。对于从.cpp
到.o
的编译,g ++需要-c标志,但cmake会自动为我们添加它。
但是在生成.so
库时,g ++无法理解-c标志的含义。因此它没有生成.so
文件,也没有给出任何错误。
删除-c
标志后,它能够生成.so共享库。
请注意,为了生成静态库,使用ar
archiver而不是g ++,因此生成静态库而不受影响。