【问题标题】:CMake include external and own headersCMake 包括外部和自己的标头
【发布时间】:2020-11-01 13:02:06
【问题描述】:

我有一个 CMakelist.txt,我在其中添加了外部头文件和库。我的构建文件。 现在,当我在主函数中调用自定义标头(“myown.h”)时,在运行 CMake 链接时会出现错误。

所以我发现我必须将自己的头文件和 .cpp 添加到带有 add_library 的库中,然后将它们添加到 target_link_libraries 下。

但是,只要我想从自己的标头调用代码,就会在构建时收到链接错误。

有谁知道错误出在哪里或我该如何继续? 这是我的 CMakelist:

cmake_minimum_required(VERSION 3.0.0)
project(MIELE_OCULUS VERSION 0.1.0)

#Hier weden die include files gefunden
INCLUDE_DIRECTORIES(
    C:/Projekte/Cpp/dev/vcpkg/installed/x64-windows/include
)
#Hier werden die lib files gefunden
LINK_DIRECTORIES(
    C:/Projekte/Cpp/dev/vcpkg/installed/x64-windows/lib,
    C:/Program Files (x86)/Windows Kits/10/Lib/10.0.19041.0/um/x64
    
)
add_library(
    test
    testclass.h
    testclass.cpp
)
add_executable(MIELE_OCULUS 
    main.cpp
)

TARGET_LINK_LIBRARIES(MIELE_OCULUS 
    cpprest_2_10
    WS2_32
    test
)

更新:

通过CMakelist.txt中的这些更改,您可以构建程序,但是在更改src代码或清理CMake项目后,会再次出现链接错误。

更改了 CMakelist:

cmake_minimum_required(VERSION 3.0.0)
project(MIELE_OCULUS VERSION 0.1.0)

add_library(
    mylib
    includes/mylib/testclass.h
    includes/mylib/testclass.cpp
)

#Hier weden die include files gefunden
TARGET_INCLUDE_DIRECTORIES(mylib PUBLIC 
    $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include/mylib>
    $<INSTALL_INTERFACE:include/mylib>  # <prefix>/include/mylib

)

INCLUDE_DIRECTORIES(
    C:/Projekte/Cpp/dev/vcpkg/installed/x64-windows/include
    C:/Projekte/Cpp/dev/Miele_Oculus
)
#Hier werden die lib files gefunden
LINK_DIRECTORIES(
    C:/Projekte/Cpp/dev/vcpkg/installed/x64-windows/lib
    C:/Program Files (x86)/Windows Kits/10/Lib/10.0.19041.0/um/x64
    
)

add_executable(MIELE_OCULUS 
    main.cpp
)

TARGET_LINK_LIBRARIES(MIELE_OCULUS 
    cpprest_2_10
    WS2_32
    mylib
)

这里是详细的输出:

Der Buildvorgang wurde am 01.11.2020 16:19:04 gestartet。 Projekt "C:\Projekte\Cpp\dev\Miele_Oculus\build\ALL_BUILD.vcxproj" auf Knoten "1" (Standardziele)。 Das Projekt "C:\Projekte\Cpp\dev\Miele_Oculus\build\ALL_BUILD.vcxproj" (1) erstellt "C:\Projekte\Cpp\dev\Miele_Oculus\b uild\ZERO_CHECK.vcxproj" (2) auf Knoten "1" (Standardziele)。 初始化构建状态: “x64\Debug\ZERO_CHECK\ZERO_CHECK.tlog\unsuccessfulbuild”wird erstellt,da“AlwaysCreate”angegeben wurde。 自定义构建: Alle Ausgaben sind aktuell。 最终构建状态: Die Datei "x64\Debug\ZERO_CHECK\ZERO_CHECK.tlog\unsuccessfulbuild" wird gelöscht。 在“x64\Debug\ZERO_CHECK\ZERO_CHECK.tlog\ZERO_CHECK.lastbuildstate”中查看时间戳。 Die Erstellung von Projekt "C:\Projekte\Cpp\dev\Miele_Oculus\build\ZERO_CHECK.vcxproj" ist abgeschlossen (Standardziele )。

Das Projekt "C:\Projekte\Cpp\dev\Miele_Oculus\build\ALL_BUILD.vcxproj" (1) erstellt "C:\Projekte\Cpp\dev\Miele_Oculus\b uild\MIELE_OCULUS.vcxproj" (3) auf Knoten "1" (Standardziele)。 Das Projekt "C:\Projekte\Cpp\dev\Miele_Oculus\build\MIELE_OCULUS.vcxproj" (3) erstellt "C:\Projekte\Cpp\dev\Miele_Oculu s\build\mylib.vcxproj" (4) auf Knoten "1" (Standardziele)。 初始化构建状态: “mylib.dir\Debug\mylib.tlog\unsuccessfulbuild”wird erstellt,da “AlwaysCreate” angegeben wurde。 自定义构建: Alle Ausgaben sind aktuell。 VcpkgTriplet 选择: 使用“C:\Projekte\Cpp\dev\vcpkg\installed\x64-windows”中的三元组“x64-windows” Cl编译: Alle Ausgaben sind aktuell。 库: Alle Ausgaben sind aktuell。 mylib.vcxproj -> C:\Projekte\Cpp\dev\Miele_Oculus\build\Debug\mylib.lib AppLocalFromInstalled: C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -ExecutionPolicy 绕过 -noprofile -File "C:\Projekte\Cpp\d ev\vcpkg\scripts\buildsystems\msbuild\applocal.ps1" "C:\Projekte\Cpp\dev\Miele_Oculus\build\Debug\mylib.lib" "C:\Proj ekte\Cpp\dev\vcpkg\installed\x64-windows\debug\bin" "mylib.dir\Debug\mylib.tlog\mylib.write.1u.tlog" "mylib.dir\Debug \vcpkg.applocal.log" 最终构建状态: Die Datei "mylib.dir\Debug\mylib.tlog\unsuccessfulbuild" wird gelöscht。 将时间戳用于“mylib.dir\Debug\mylib.tlog\mylib.lastbuildstate”。 Die Erstellung von Projekt "C:\Projekte\Cpp\dev\Miele_Oculus\build\mylib.vcxproj" ist abgeschlossen (Standardziele)。

初始化构建状态: Aktualisieren des Timestamps von "MIELE_OCULUS.dir\Debug\MIELE_OCULUS.tlog\unsuccessfulbuild"。 自定义构建: Alle Ausgaben sind aktuell。 VcpkgTriplet 选择: 使用“C:\Projekte\Cpp\dev\vcpkg\installed\x64-windows”中的三元组“x64-windows” Cl编译: Alle Ausgaben sind aktuell。 关联: C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.27.29110\bin\HostX64\x64\link.exe /ERR ORREPORT:QUEUE /OUT:"C:\Projekte\Cpp\dev\Miele_Oculus\build\Debug\MIELE_OCULUS.exe" /INCREMENTAL /NOLOGO /LIBPATH:"C: /Projekte/Cpp/dev/vcpkg/installed/x64-windows/lib" /LIBPATH:"C:/Projekte/Cpp/dev/vcpkg/installed/x64-windows/lib/Debu g" /LIBPATH:C:/Program /LIBPATH:C:/Program/Debug /LIBPATH:C:/Projekte/Cpp/dev/Miele_Oculus/Files /LIBPATH:C:/Projekte /Cpp/dev/Miele_Oculus/Files/Debug /LIBPATH:"C:/Projekte/Cpp/dev/Miele_Oculus/(" /LIBPATH:"C:/Projekte/Cpp/dev/Miele_O culus/(/Debug" /LIBPATH:C:/Projekte/Cpp/dev/Miele_Oculus/x86 /LIBPATH:C:/Projekte/Cpp/dev/Miele_Oculus/x86/Debug /LIB PATH:"C:/Projekte/Cpp/dev/Miele_Oculus/)" /LIBPATH:"C:/Projekte/Cpp/dev/Miele_Oculus/)/Debug" /LIBPATH:/Windows /LIBP ATH:/Windows/Debug /LIBPATH:C:/Projekte/Cpp/dev/Miele_Oculus/Kits/10/Lib/10.0.19041.0/um/x64 /LIBPATH:C:/Projekte/Cpp /dev/Miele_Oculus/Kits/10/Lib/10.0.19041.0/um/x64/Debug /LIBPATH:"C:\Projekte\Cpp\dev\vcpkg\installed\x64-windows\deb ug\lib" /LIBPATH:"C:\Projekte\Cpp\dev\vcpkg\installed\x64-windows\debug\lib\manual-link" cpprest_2_10.lib WS2_32.lib 调试\mylib.lib kernel32.lib user32.lib gdi32.lib winspool.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comdlg32.l ib advapi32.lib "C:\Projekte\Cpp\dev\vcpkg\installed\x64-windows\debug\lib*.lib" /MANIFEST /MANIFESTUAC:"level='asIn voker' uiAccess='false'" /manifest:embed /DEBUG /PDB:"C:/Projekte/Cpp/dev/Miele_Oculus/build/Debug/MIELE_OCULUS.pdb" /SUBSYSTEM:CONSOLE /TLBID:1 /DYNAMICBASE /NXCOMPAT /IMPLIB:"C:/Projekte/Cpp/dev/Miele_Oculus/build/Debug/MIELE_OCULUS .lib" /MACHINE:X64 /machine:x64 MIELE_OCULUS.dir\Debug\main.obj LINK : 致命错误 LNK1104: Datei "C:\Projekte\Cpp\dev\Miele_Oculus\build\Debug\MIELE_OCULUS.exe" kann nicht geöffnet w 厄登[C:\Projekte\Cpp\dev\Miele_Oculus\build\MIELE_OCULUS.vcxproj] Die Erstellung des Projekts "C:\Projekte\Cpp\dev\Miele_Oculus\build\MIELE_OCULUS.vcxproj" ist abgeschlossen (Standardzi ele) -- 费勒。

Die Erstellung des Projekts "C:\Projekte\Cpp\dev\Miele_Oculus\build\ALL_BUILD.vcxproj" ist abgeschlossen (Standardziele ) -- 费勒。

Fehler beim Buildvorgang.

"C:\Projekte\Cpp\dev\Miele_Oculus\build\ALL_BUILD.vcxproj" (Standardziel) (1) -> "C:\Projekte\Cpp\dev\Miele_Oculus\build\MIELE_OCULUS.vcxproj" (Standardziel) (3) -> (链接齐尔)-> LINK : 致命错误 LNK1104: Datei "C:\Projekte\Cpp\dev\Miele_Oculus\build\Debug\MIELE_OCULUS.exe" kann nicht geöffnet 韦尔登[C:\Projekte\Cpp\dev\Miele_Oculus\build\MIELE_OCULUS.vcxproj]

0 Warnung(en)
1 Fehler

Verstrichene Zeit 00:00:00.90

【问题讨论】:

  • C:/Projekte/Cpp/dev/vcpkg/installed/x64-windows/lib, 逗号错误
  • 谢谢,我已将其删除,但不幸的是这并没有改变我的问题:/
  • add_library 调用中添加标头不会为标头添加包含目录。您需要手动添加这些目录,使用INCLUDE_DIRECTORIESTARGET_INCLUDE_DIRECTORIES
  • 好的,谢谢现在它可以工作了,但我有一个奇怪的 cmake 行为。当我第一次构建项目时,cmake 创建它,我可以运行完成的程序。如果我更改 src 代码和/或清理 cmake 项目,我会再次收到链接错误。如果我重新启动我的 IDE(VS CODE)并构建它,那么它可以使用更改后的 src 代码。我将发布我更改后的 CMakelist.txt,我认为这是问题所在。
  • ustom headers ("myown.h") in my main function I get errors when running CMake linking. 标头不会影响链接。请发布错误。请发布建设的详细输出 - cmake --build dir --verbose

标签: c++ cmake header-files cmakelists-options


【解决方案1】:

现在可以了

1: 在 add_library 调用中添加标头不会为标头添加包含目录。 您需要手动添加这些目录,使用 INCLUDE_DIRECTORIES 或 TARGET_INCLUDE_DIRECTORIES

我添加了这部分:

#Eigene header Dateien include
TARGET_INCLUDE_DIRECTORIES(mylib PUBLIC 
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/includes/mylib>
$<INSTALL_INTERFACE:includes/mylib>  # <prefix>/includes/mylib

非常感谢 Tsyvarev ! :)

2:

“奇怪”的行为对我来说是一个严重的错误,因为我不知道我在 Windows 中删除了输出终端,然后我在命令窗口中开始了一个新的构建

谢谢你们!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-14
    • 1970-01-01
    相关资源
    最近更新 更多