Путаница в отношении требований к транзитивному использованию в CMake ⇐ C++
Путаница в отношении требований к транзитивному использованию в CMake
В этой ситуации есть 4 цели:
TargetC должен ссылаться на TargetB, а TargetB должен ссылаться на TargetA.
TargetA также зависит от библиотеки C MyCLibrary.
Эта зависимость указывается в CMake следующими вызовами:
CMakeLists.txt
TargetC
. . . target_link_libraries (TargetC ЦельБ) . . . CMakeLists.txt
TargetB
. . . find_package (TargetA CONFIG) target_link_libraries(TargetB ЧАСТНАЯ ЦельА) . . . CMakeLists.txt
TargetA:
. . . find_library(MyCLibrary "myclibrary") . . . target_link_libraries(TargetA Частный ${MyCLibrary}) . . .
Однако при сборке TargetC он связывает TargetB И TargetA, хотя TargetB уже связан TargetA, когда он был построен.
Вот как выглядит фактический процесс связывания, когда я запускаю make VERBOSE=1:
g++ TargetC.o TargetC /path/to/TargetB.a -lTargetA Во-первых, почему CMake вообще генерирует ссылку на TargetA? При вызове target_link_libraries я указал, что TargetA является частной зависимостью для TargetB.
Во-вторых, не является ли ссылка на TargetA излишней, учитывая, что TargetB.a был создан путем ссылки на TargetA?
>
В-третьих, компоновщик не может разрешить библиотеку TargetA, поскольку она передана с параметром -l. Даже если я вручную укажу полный путь к TargetA.a, компоновщик теперь жалуется, что не может разрешить ни один из символов, определенных в MyCLibrary. Однако TargetA.a был создан путем связывания с MyCLibrary, поэтому я не понимаю, почему эти символы должны быть неразрешенными.
В этой ситуации есть 4 цели:
TargetC должен ссылаться на TargetB, а TargetB должен ссылаться на TargetA.
TargetA также зависит от библиотеки C MyCLibrary.
Эта зависимость указывается в CMake следующими вызовами:
CMakeLists.txt
TargetC
. . . target_link_libraries (TargetC ЦельБ) . . . CMakeLists.txt
TargetB
. . . find_package (TargetA CONFIG) target_link_libraries(TargetB ЧАСТНАЯ ЦельА) . . . CMakeLists.txt
TargetA:
. . . find_library(MyCLibrary "myclibrary") . . . target_link_libraries(TargetA Частный ${MyCLibrary}) . . .
Однако при сборке TargetC он связывает TargetB И TargetA, хотя TargetB уже связан TargetA, когда он был построен.
Вот как выглядит фактический процесс связывания, когда я запускаю make VERBOSE=1:
g++ TargetC.o TargetC /path/to/TargetB.a -lTargetA Во-первых, почему CMake вообще генерирует ссылку на TargetA? При вызове target_link_libraries я указал, что TargetA является частной зависимостью для TargetB.
Во-вторых, не является ли ссылка на TargetA излишней, учитывая, что TargetB.a был создан путем ссылки на TargetA?
>
В-третьих, компоновщик не может разрешить библиотеку TargetA, поскольку она передана с параметром -l. Даже если я вручную укажу полный путь к TargetA.a, компоновщик теперь жалуется, что не может разрешить ни один из символов, определенных в MyCLibrary. Однако TargetA.a был создан путем связывания с MyCLibrary, поэтому я не понимаю, почему эти символы должны быть неразрешенными.
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение