0

我有一个 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 “(标准)。InitializeBuildStatus:“x64\Debug\ZERO_CHECK\ZERO_CHECK.tlog\unsuccessfulbuild”wird erstellt,da“AlwaysCreate”angegeben wurde。CustomBuild: Alle Ausgaben sind aktuell。FinalizeBuildStatus: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:

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 “(标准)。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 “(标准)。InitializeBuildStatus:“mylib.dir\Debug\mylib.tlog\unsuccessfulbuild”wird erstellt,da“AlwaysCreate”angegeben wurde。CustomBuild: Alle Ausgaben sind aktuell。VcpkgTripletSelection:使用来自 "C:\Projekte\Cpp\dev\vcpkg\installed\x64-windows" 的三元组 "x64-windows" ClCompile: Alle Ausgaben sind aktuell。Lib: 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 Bypass -noprofile -File "C:\Projekte\Cpp\d ev\vcpkg\scripts\buildsystems\msbuild\applocal.ps1" "C:\Projekte\Cpp\dev\Miele_Oculus\build\Debug\mylib.lib" "C:\Projekte\Cpp\dev\vcpkg\installed\x64 -windows\debug\bin" "mylib.dir\Debug\mylib.tlog\mylib.write.1u.tlog" "mylib.dir\Debug\vcpkg.applocal.log" FinalizeBuildStatus: 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)。lib AppLocalFromInstalled: C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -ExecutionPolicy Bypass -noprofile -File "C:\Projekte\Cpp\d ev\vcpkg\scripts\buildsystems\msbuild\applocal.ps1" " C:\Projekte\Cpp\dev\Miele_Oculus\build\Debug\mylib.lib" "C:\Projekte\Cpp\dev\vcpkg\installed\x64-windows\debug\bin" "mylib.dir\Debug\mylib .tlog\mylib.write.1u.tlog" "mylib.dir\Debug \vcpkg.applocal.log" FinalizeBuildStatus: 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)。lib AppLocalFromInstalled: C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -ExecutionPolicy Bypass -noprofile -File "C:\Projekte\Cpp\d ev\vcpkg\scripts\buildsystems\msbuild\applocal.ps1" " C:\Projekte\Cpp\dev\Miele_Oculus\build\Debug\mylib.lib" "C:\Projekte\Cpp\dev\vcpkg\installed\x64-windows\debug\bin" "mylib.dir\Debug\mylib .tlog\mylib.write.1u.tlog" "mylib.dir\Debug \vcpkg.applocal.log" FinalizeBuildStatus: 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)。exe -ExecutionPolicy 绕过 -noprofile -File "C:\Projekte\Cpp\dev\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" FinalizeBuildStatus: 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)。exe -ExecutionPolicy 绕过 -noprofile -File "C:\Projekte\Cpp\dev\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" FinalizeBuildStatus: 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)。"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" FinalizeBuildStatus: 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)。"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" FinalizeBuildStatus: 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)。

InitializeBuildStatus: Aktualisieren des Timestamps von "MIELE_OCULUS.dir\Debug\MIELE_OCULUS.tlog\unsuccessfulbuild"。CustomBuild: Alle Ausgaben sind aktuell。VcpkgTripletSelection:使用来自 "C:\Projekte\Cpp\dev\vcpkg\installed\x64-windows" 的三元组 "x64-windows" ClCompile: 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/Debug" /LIBPATH:C:/Program /LIBPATH:C:/Program/Debug /LIBPATH:C:/Projekte/Cpp/dev/Miele_Oculus/Files /LIBPATH:C: lib oleaut32.lib uuid.lib comdlg32.lib 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 链接:致命错误 LNK1104: Datei "C:\Projekte \Cpp\dev\Miele_Oculus\build\Debug\MIELE_OCULUS.exe" [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) -- FEHLER。

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

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 Ziel) -> LINK : 致命错误 LNK1104: Datei "C:\Projekte\Cpp\dev\Miele_Oculus\build\Debug\MIELE_OCULUS.exe" kann nicht geöffnet werden。[C:\Projekte\Cpp\dev\Miele_Oculus\build\MIELE_OCULUS.vcxproj]

0 Warnung(en)
1 Fehler

Verstrichene Zeit 00:00:00.90

4

1 回答 1

0

现在它可以工作了

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 中的输出终端,然后我在命令窗口中开始了一个新的构建

感谢你们!

于 2020-11-01T15:59:01.630 回答