Cmake不能生成共享库,只能生成静态库
Cmake cannot generate shared library, but static library is generated
我想用CMake生成一个共享库,即使我没有得到任何错误,库(所以没有生成file)。
这是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})
当我创建build dir,从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
归档器而不是g++,因此生成静态库没有受到影响。
相关文章:
- 将静态库链接到不带-fPIC的共享库中
- C++两个源文件之间共享的枚举的静态实例
- 内联函数的函数本地静态对象是否在共享对象文件之间共享?
- Android NDK:用于第三方Java库的静态或共享C++运行时
- 仅在少数方法(静态或共享库)中解析的外部符号
- c++ 是否保证标头初始化的静态 const 成员跨编译单元和库共享单个实例?
- 函数范围的静态变量如何导致与共享库中函数代码的未来使用不兼容
- 如何在共享库中保留静态库中的自由函数
- Cmake 查找模块用于区分共享库或静态库
- 指向静态常量对象的共享指针?
- 从静态库构建共享库
- 如何从静态c和c++库创建共享c库
- 将共享对象与静态库链接
- 共享库中静态功能成员的破坏顺序
- 使用 MapViewOfFile 分配静态共享内存
- 为多个类实例维护共享_ptr的静态列表
- 使用C 中的共享_ptr从公共静态成员函数访问私有构造函数
- Cython:无法调用共享库的非静态方法
- 两个C++库如何共享一个静态缓冲区?
- 在使用自动工具构建静态/共享库时,如何避免双重编译