cmake无法生成共享库,但是生成了静态库
Cmake cannot generate shared library, but static library is generated
我想用 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
文件。我在这里遗漏了一些明显的东西吗?
错误在 CMAKE_C_FLAGS
和 CMAKE_CXX_FLAGS
。为了从 .cpp
编译到 .o
,g++ 需要 -c 标志,但 cmake 会自动为我们添加它。
但是在生成.so
库时,g++ 无法理解-c 标志的含义。因此它没有生成 .so
文件,也没有给出任何错误。
删除 -c
标志后,它能够生成 .so 共享库。
注意生成静态库时,使用了ar
archiver 而不是g++,因此生成静态库没有受到影响。
我想用 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
文件。我在这里遗漏了一些明显的东西吗?
错误在 CMAKE_C_FLAGS
和 CMAKE_CXX_FLAGS
。为了从 .cpp
编译到 .o
,g++ 需要 -c 标志,但 cmake 会自动为我们添加它。
但是在生成.so
库时,g++ 无法理解-c 标志的含义。因此它没有生成 .so
文件,也没有给出任何错误。
删除 -c
标志后,它能够生成 .so 共享库。
注意生成静态库时,使用了ar
archiver 而不是g++,因此生成静态库没有受到影响。