相关疑难解决方法(0)

如何使用cmake将编译器命令行args放在特定的地方

所以我正在用两个静态库构建一个共享库.

这个答案说这样做的方法是-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之前appmodels,然后-Wl,--no-whole-archive在他们之后(以标准库进口不要被共享库导出).

在CMake中最简单的方法是什么?


另外:所以我想尽可能多地使用标准的cmake东西,这样我就不需要为Windows构建做任何额外的工作,因为CMake会删除平台上不支持的编译器定义.建成.

gnu g++ cmake ld

9
推荐指数
1
解决办法
1万
查看次数

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),但这并不能将符号从静态库获取到共享库的接口中。

如何获得没有“传递”行为的符号?

(以与平台无关的方式)

c c++ cmake

5
推荐指数
1
解决办法
9423
查看次数

Cmake:链接到静态内部库而不导出它

我有一个这种结构的项目:

/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应该是共享库但我甚至无法使静态版本工作,所以为了简单起见,我在描述可导出库的静态情况.

c++ linker cmake

3
推荐指数
2
解决办法
1501
查看次数

CMake将来自不同CMakeLists.txt的对象附加到一个库中

我想从多个子目录中的对象创建一个库,每个子库包含自己的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)

linker build cmake unix-ar

1
推荐指数
1
解决办法
1278
查看次数

标签 统计

cmake ×4

c++ ×2

linker ×2

build ×1

c ×1

g++ ×1

gnu ×1

ld ×1

unix-ar ×1