Cygwin下用CMake编译库

Posted

技术标签:

【中文标题】Cygwin下用CMake编译库【英文标题】:Compiling libraries with CMake under Cygwin 【发布时间】:2010-09-21 18:18:25 【问题描述】:

我一直在尝试使用 CMake 作为一种迷你项目来编译 TinyXML,并尝试学习 CMake。另外,我正在尝试将其编译为动态库并自行安装以使其正常工作。

到目前为止,我已经设法让它编译和安装,但它编译成一个 .dll 和一个 .dll.a,让它工作的唯一方法是将它安装到 /bin 和 /lib 中,这使得它将两个文件都安装在两个文件夹中。此设置有效,但我猜 .dll 应该在 /bin 中,而 .dll.a 应该在 /lib 中。这是某种 Cygwin 特有的问题还是我做错了什么?

【问题讨论】:

发布您的CMakeLists.txt,让人们有机会猜到问题。 我很想有人回答如何使它成为一个静态库。 *.lib 我认为? 【参考方案1】:

.dll 是运行时库文件,它必须在运行时出现在目标系统上(并且在 $PATH 中)。 .dll.a 文件是 .dll 的导入库,它必须在链接时出现在编译机器上。您需要将 .dll 文件分发到程序应该运行的地方,并将 .dll 和 .dll.a 分发到使用该库链接其他程序的地方。您不需要仅在运行该程序的机器上的 .dll.a 文件。

当您不想创建共享库时,可以在 add_library 命令中使用 static keyword 告诉 cmake:

add_library(mylib STATIC foo.c bar.cpp)

这种方式不会创建共享库,但链接器会将库中的代码添加到最终的可执行文件中。

【讨论】:

你真的需要lib/中的DLL吗? DLL 平台上的约定是可执行文件(DLL 被认为是)应该放在 PATH (= /bin) 中。剩下的 dll.a 应该在 /lib 中。我还没有看到 Cmake 开箱即用地理解这一点。有人吗? @ThomasNilsson 我的意思是在库链接到其他程序的机器上需要 .dll.a 文件。它不需要将它们安装在 bin/ 中,它只需要注意导入库在链接时位于链接器搜索路径中。【参考方案2】:

您需要为每种类型的文件指定一个目的地。

.dll 被认为是一个 RUNTIME 库,而 .a 是一个 ARCHIVE。以防万一,对于其他平台,您可能需要 LIBRARY 条目(用于 .so 文件)。

install( TARGETS $PROJECT_NAME
  LIBRARY DESTINATION lib
  ARCHIVE DESTINATION lib
  RUNTIME DESTINATION bin
)

【讨论】:

以上是关于Cygwin下用CMake编译库的主要内容,如果未能解决你的问题,请参考以下文章

编译icu库(用到了cygwin)

在 Visual Studio 中使用 cygwin 编译的 dll 的库函数时出错

使用 qt 和 cygwin 的编译器编译独立应用程序

用cygwin在windows中链接linux静态库

从源代码编译 cygwin1.dll

在 Cygwin 或 MinGW 中使用 CMake 和 AVR 工具链