【问题标题】:Unable to link library with test binaries in cmake无法将库与 cmake 中的测试二进制文件链接
【发布时间】:2016-10-19 15:47:40
【问题描述】:

我不知道如何在 Windows 上使用 cmake 将我的静态库与我的测试二进制文件链接起来。我做错了什么?

项目结构如下图

MyProject
  - build
  - include
    - catch
      - *.h
    - MyProject
      - *.h
  - src
    - *.c
  - test
    - *.cpp
  - CMakeLists.txt

还有 CMakeLists.txt

CMAKE_MINIMUM_REQUIRED ( VERSION 3.3.1 )

SET ( NAME_LIB     "myproject" )
SET ( NAME_TEST    "test_myproject" )
SET ( PATH_BUILD   "${PROJECT_SOURCE_DIR}/build" )
SET ( PATH_INCLUDE "${PROJECT_SOURCE_DIR}/include" )
SET ( PATH_SOURCE  "${PROJECT_SOURCE_DIR}/src" )
SET ( PATH_TEST    "${PROJECT_SOURCE_DIR}/test" )

FILE ( GLOB SOURCES_LIB  "${PATH_SOURCE}/*.c" "${PATH_SOURCE}/*.cpp" )
FILE ( GLOB SOURCES_TEST "${PATH_TEST}/*.c" "${PATH_TEST}/*.cpp" )

INCLUDE_DIRECTORIES ("${PATH_INCLUDE}")

ADD_LIBRARY( ${NAME_LIB} STATIC "${SOURCES_LIB}" )
ADD_EXECUTABLE ( ${NAME_TEST} "${SOURCES_TEST}" )
TARGET_LINK_LIBRARIES ( ${NAME_TEST} "${PATH_BUILD}/${NAME_LIB}" )

使用 cmake 创建 Visual Studio 项目没问题,但是当我尝试使用 msbuild 构建解决方案时,出现以下错误。

(Link target) ->
  LINK : fatal error LNK1104: cannot open file 'myproject.obj' [D:\Source\myproject\build\test_myproject.vcxproj]

指定库名而不是绝对路径时出错。

test_myproject.obj : error LNK2019: unresolved external symbol "int __cdecl myproject_parse(char const *)" (?myproject_parse@@YAHPBD@Z
) referenced in function _main [D:\Source\myproject\build\test_myproject.vcxproj]
D:\Source\myproject\build\Debug\test_myproject.exe : fatal error LNK1120: 1 unresolved externals [D:\Source\myproject\build\test_
myproject.vcxproj]

【问题讨论】:

  • 您似乎在混合使用 C 和 C++,因此您必须确保 myproject_parse 不受 C++ 名称修改的影响
  • 能否请您使用dumpbin 输出myproject.lib 中的符号,例如dumpbin /headers myproject.lib,并确保列出“解析”符号

标签: c++ c build msbuild cmake


【解决方案1】:

尝试通过目标名称链接您的库,也可以确保库的源包含您期望的文件,另一种可能是没有编译任何符号

TARGET_LINK_LIBRARIES ( ${NAME_TEST} ${NAME_LIB} )

【讨论】:

  • 不使用绝对路径会导致链接器错误(无法解析的外部符号)。
  • 未解析的外部符号是一个更好的错误(从诊断的角度来看),请给我完整的错误信息
  • 我用有关链接器错误的信息更新了原始帖子
  • @ThomasDoyle,我注意到你接受了这个,你解决了你的构建问题吗?
  • 我将此标记为已接受的答案,因为链接器问题是实际问题。由于我混合了 c 和 cpp 标识符被破坏并强制 CXX 解决了这个问题。
猜你喜欢
  • 2013-12-25
  • 2014-05-14
  • 2019-01-31
  • 1970-01-01
  • 2013-10-06
  • 2015-11-25
  • 2015-03-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多