2

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

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

4

2 回答 2

3

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

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

add_library(mylib STATIC foo.c bar.cpp)

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

于 2010-09-22T07:22:01.717 回答
1

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

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

install( TARGETS ${PROJECT_NAME}
  LIBRARY DESTINATION lib
  ARCHIVE DESTINATION lib
  RUNTIME DESTINATION bin
)
于 2015-03-24T08:43:34.220 回答