4

我想将 ws2_32.lib 包含到我的应用程序中,但 CMake 会附加到-l项目属性上。

...
add_executable(Executive ${exec_src})
target_link_libraries(Executive ws2_32)

这就是我的 CMakeLists.txt 文件的样子,但是当我检查“输入”下的 VS2010 链接器属性页面时,它会列出-lws2_32.lib. 为什么要添加-l? 以及如何删除它,因为一旦我手动更改它以读取ws2_32.lib项目就能够正确链接。

我尝试了以下方法: find_library(WIN_C ws2_32)但结果是NOTFOUND.

4

2 回答 2

2

自从我之前的回答以来,我自己找到了更好的方法。

在您的 CMAKE 输出开始时,您是否看到类似这样的内容?:

The C compiler identification is unknown
The CXX compiler identification is unknown

如果是这样,CMake 似乎没有正确确定您的编译器 - 因此没有正确计算出如何传递链接器参数。

就我而言,它看起来像是被我安装的工具套件弄糊涂了。我有各种版本的 VS2010 express 工具,还有 TFS Team Explorer——它安装了 Visual Studio shell。看起来 CMake 看到了 devenv.exe 的存在,因此假设我有一个完整的视觉工作室。

您可以通过指定 CMAKE_MAKE_PROGRAM 变量来解决此问题 - 在命令行中使用 -D CMAKE_MAKE_PROGRAM 或在 GUI 中通过勾选高级复选框并找到条目。我需要将它从 C:/PROGRA~2/MICROS~1.0/Common7/IDE/devenv.com 更改为 C:/PROGRA~2/MICROS~1.0/Common7/IDE/VCExpress.exe - 注意正斜杠!

一旦我完成了,我就不需要再做 find_library 的事情了。

于 2013-08-14T11:18:25.903 回答
1

我在使用 Visual Studio 2010 生成器和 CMake 2.8.11.2 时遇到了同样的问题。就我而言,我试图与 wininet.lib 链接。我认为这是 CMake 中的一个错误,我花了很长时间寻找解决方法。最终我发现以下工作:

使用 find_library 命令查找 .lib 文件的绝对路径,并将其分配给变量。然后在 target_link_libraries 命令中使用该变量。在您的情况下,它看起来像这样:

find_library(ws2_32_LIBRARY_PATH ws2_32)
add_executable(Executive ${exec_src})
target_link_libraries(Executive ${ws2_32_LIBRARY_PATH})

希望可以节省一些时间。

于 2013-08-13T13:28:19.930 回答