Cmake不能生成共享库,只能生成静态库

Cmake cannot generate shared library, but static library is generated

本文关键字:静态 共享 不能 Cmake      更新时间:2023-10-16

我想用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_FLAGSCMAKE_CXX_FLAGS。为了从.cpp编译到.o, g++需要-c标志,但是cmake会自动为我们添加它。

但是在生成.so库时,g++无法理解-c标志的含义。因此,它没有生成.so文件,也没有给出任何错误。

删除-c标志后,它能够生成.so共享库。

请注意,对于生成静态库,使用ar归档器而不是g++,因此生成静态库没有受到影响。