所以我正在用两个静态库构建一个共享库.
这个答案说这样做的方法是-Wl,--whole-archive在我的静态库之前插入,然后插入-Wl,--no-whole-archive它们.
那么我目前在cmake中为共享库提供的是:
add_library(wittyPlus SHARED empty.cpp)
target_link_libraries(wittyPlus
${wtdbosqlite}
${WT_LIBRARIES}
${DB_LIBRARIES}
${Boost_LIBRARIES}
app models
)
Run Code Online (Sandbox Code Playgroud)
所以,我需要的是为它加上-Wl,--whole-archive之前app和models,然后-Wl,--no-whole-archive在他们之后(以标准库进口不要被共享库导出).
在CMake中最简单的方法是什么?
另外:所以我想尽可能多地使用标准的cmake东西,这样我就不需要为Windows构建做任何额外的工作,因为CMake会删除平台上不支持的编译器定义.建成.
我正在将AutoTools项目移植到CMake。
AutoTools的作用:
我已经设法使用CMake进行了以下操作:
add_library(staticfoo <src>)add_library(sharedfoo SHARED <src>)并将它们链接-target_link_libraries(sharedfoo staticfoo)target_link_libraries(exe sharedfoo),但这也再次将静态库拖入其中。因此,可执行文件的结果链接命令除了共享外还具有静态库。这与AutoTools项目生成的命令不对应。
我已经尝试过了target_link_libraries(sharedfoo PRIVATE staticfoo),但这并不能将符号从静态库获取到共享库的接口中。
如何获得没有“传递”行为的符号?
(以与平台无关的方式)
我有一个这种结构的项目:
/path/to/my/project
??? CMakeLists.txt
??? internal-libs
? ??? internal-lib1
??? libs
? ??? lib1
? ??? lib2
Run Code Online (Sandbox Code Playgroud)
lib1 是一个静态库.
lib2 是一个静态库.
internal-lib1 是一个静态库.
lib2静态链接到lib2和internal-lib1.lib1并将lib2被出口,但internal-lib1将被抛在后面.对于联系,我有:
target_link_libraries(lib2 PRIVATE internal-lib1)
target_link_libraries(lib2 PRIVATE lib1)
Run Code Online (Sandbox Code Playgroud)
我的理解是因为我是静态链接和私有链接,所以关于internal-lib1的所有信息都将包含在lib2中,并且我不必将internal-lib1导出到外部世界.
但是,当我尝试在客户端程序中使用它时,我收到错误:
/usr/bin/ld cannot find -llib-internal1
collect2: error: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)
在我生成的导出配置文件中,我有:
# Create imported target lib2
add_library(lib2 STATIC IMPORTED)
set_target_properties(lib2 PROPERTIES
INTERFACE_LINK_LIBRARIES "$<LINK_ONLY:lib1>;**$<LINK_ONLY:internal-lib1>**"
)
# Create imported target lib1
add_library(lib1 STATIC IMPORTED)
Run Code Online (Sandbox Code Playgroud)
我误解了静态链接还是我的设置有问题?我正在使用cmake 3.2.2.我的所有目标包括私人.我不明白为什么INTERFACE_LINK_LIBRARIES填充条目和LINK_ONLY意味着什么.
ps实际上lib1和lib2应该是共享库但我甚至无法使静态版本工作,所以为了简单起见,我在描述可导出库的静态情况.
我想从多个子目录中的对象创建一个库,每个子库包含自己的CMakeLists.txt和OBJECT库技巧,以使多个目标具有不同的编译选项。
这些是文件:
project_dir
|--- subdir1
| |--- src1.c
| |--- CMakeLists.txt
|--- subdir2
| |--- src2.c
| |--- CMakeLists.txt
|--- CMakeLists.txt
Run Code Online (Sandbox Code Playgroud)
所有CMakeLists.txt的内容
// project_dir/CMakeLists.txt
// what to put here? to make one single library (mainLib)
// project_dir/subdir1/CMakeLists.txt
add_library(lib11 OBJECT src1.c)
set_target_properties(lib11 PROPERTIES COMPILE_FLAGS "some-flags11")
add_library(lib12 OBJECT src1.c)
set_target_properties(lib12 PROPERTIES COMPILE_FLAGS "some-flags12")
// here I would like to add lib11:objects and lib12:objects to mainLib
// how should it be done?
// project_dir/subdir2/CMakeLists.txt
// *** similar to subdir1 but with src2.c that …Run Code Online (Sandbox Code Playgroud)