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

mat*_*tiu 9 gnu g++ cmake ld

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

这个答案说这样做的方法是-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会删除平台上不支持的编译器定义.建成.

mat*_*tiu 17

好吧,这比我想象的容易得多.

所以根据cmake文档:

以" - "开头但不是"-l"或"-framework"的项目名称被视为链接器标志.

所以修复只是为了:

add_library(wittyPlus SHARED empty.cpp)
target_link_libraries(wittyPlus 
    ${wtdbosqlite}
    ${WT_LIBRARIES}
    ${DB_LIBRARIES}
    ${Boost_LIBRARIES}
    "-Wl,--whole-archive"
    app models
    "-Wl,--no-whole-archive"
)
Run Code Online (Sandbox Code Playgroud)

我不知道它是否可以在Windows上工作,我希望它会像cmake一样超级聪明.

用objdump查看结果,它似乎在导出中有很多提升的东西,所以我可能做错了.

objdump -C -t wittyPlus/libwittyPlus.so | grep -i boost
Run Code Online (Sandbox Code Playgroud)

但它确实有我需要链接的东西,所以,这是向前迈出的一步.

任何其他答案仍然赞赏.基本上我要做的就是和这个问题一样:

CMake:如何从子项目的所有静态库创建单个共享库?

  • 如果你不想用垃圾文件污染真正的源代码树,我看起来你可以做`file(WRITE empty.cpp"")`. (3认同)