Cmake error LNK2019 bei gleichem Namen für Lib und Exe
Ich bin kürzlich über ein Problem gestolpert was mir fast einen Tag Fehlersuche gekostet hat:
LINK : fatal error LNK1181: cannot open input file 'lib\Test.lib'
Der Fehler lässt sich nicht leicht reproduzieren, da es hier mit dem Timing zusammenhängt.
Datei erstellen main.cpp:
extern void print(void);
int main(int,char**)
{
print();
return 0;
}
Datei erstellen lib.cpp:
#include <stdio.h>
void print(void)
{
printf("Hello Test");
}
Datei erstellen CMakeLists.txt:
cmake_minimum_required (VERSION 3.18)
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "lib/static")
add_library(Test STATIC lib.cpp)
add_executable(TestApp main.cpp)
target_link_libraries(TestApp LINK_PUBLIC Test)
set_target_properties(TestApp PROPERTIES OUTPUT_NAME Test)
Build starten:
mkdir test
cd test
cmake ..
cmake --build .
Wenn dieses minimale Projekt gebaut wird, wird der Eingangs erwähnte Fehler produziert.
Ursache
Aufgrund des Ziels dass am Ende eine Test.lib und eine dazugehörige Test.exe herauskommen soll, liegt hier im Output-Verzeichnis, bei den temporären Build-Dateien, eine Namens-Kollision vor.
Der Build von TestApp erzeugt durch die Umbenennung von OUTPUT_NAME die gleichen temporären Dateien wie die Test lib. Diese werden vor dem build gelöscht, weshalb die der Linker für die TestApp die Test.lib nicht finden kann.
Lösung
Zusätlich zum OUTPUT_NAME sollte die Exe noch einen weitere Umbenennung bekommen für ARCHIVE_OUTPUT_NAME:
set_target_properties(TestApp PROPERTIES ARCHIVE_OUTPUT_NAME TestApp)
Danach läuft der Build wieder ohne Fehler durch.