Конвертировать qmake в CMake - PullRequest
1 голос
/ 04 февраля 2020

Я новичок в CMake, но раньше я использовал qmake. В моем qmake у меня есть следующее для добавления библиотеки stati c, которая находится внутри папки с именем bin, внутри папки проекта:

QT -= gui
QT += core

CONFIG += c++11 console
CONFIG -= app_bundle
DEFINES += QT_DEPRECATED_WARNINGS
SOURCES += \
        main.cpp
macx: LIBS += -L$$PWD/bin/lib/ -lnanomsg
INCLUDEPATH += $$PWD/bin/include
DEPENDPATH += $$PWD/bin/include
macx: PRE_TARGETDEPS += $$PWD/bin/lib/libnanomsg.a

Каков соответствующий синтаксис CMake?

Я попробовал следующее:

INCLUDE_DIRECTORIES(./bin/include)
LINK_DIRECTORIES($(CMAKE_SOURCE_DIR)/bin/lib/)
TARGET_LINK_LIBRARIES(nanomsg)

но я получаю сообщение "не могу указать целевую библиотеку ссылок для nanomsg, которая не создается этим проектом", ошибка. Я построил библиотеку, выровненную из другого проекта.

Когда я удаляю target_link_libraries, я получаю ошибки компоновщика для неопределенных символов.

[Обновлено: вот окончательный рабочий файл CMake]

cmake_minimum_required(VERSION 3.0.0)
project(cmake-linkstatic VERSION 0.1 LANGUAGES CXX)
set(CMAKE_INCLUDE_CURRENT_DIR ON)
set(CMAKE_AUTOMOC ON)
find_package(Qt5Core)
add_executable(${PROJECT_NAME} "main.cpp")
target_link_libraries(${PROJECT_NAME} Qt5::Core)
#this line is not needed any more
#INCLUDE_DIRECTORIES(${CMAKE_CURRENT_LIST_DIR}/bin/include)
add_library(nanomsg STATIC IMPORTED)
# Specify the nanomsg library's location and include directories.
set_target_properties(nanomsg PROPERTIES
    IMPORTED_LOCATION "${CMAKE_CURRENT_LIST_DIR}/bin/lib/libnanomsg.a"
    INTERFACE_INCLUDE_DIRECTORIES "${CMAKE_CURRENT_LIST_DIR}/bin/include"
)
# Define your executable CMake target.
# Link the nanomsg library to the executable target.
target_link_libraries(${PROJECT_NAME} nanomsg)

1 Ответ

1 голос
/ 04 февраля 2020

Если вы хотите использовать предварительно собранную библиотеку stati c в вашем CMake, вы можете объявить цель STATIC IMPORTED CMake:

add_library(nanomsg STATIC IMPORTED)

# Specify the nanomsg library's location and its include directories.
set_target_properties(nanomsg PROPERTIES 
    IMPORTED_LOCATION "${CMAKE_CURRENT_LIST_DIR}/bin/lib/libnanomsg.a"
    INTERFACE_INCLUDE_DIRECTORIES "${CMAKE_CURRENT_LIST_DIR}/bin/include"
)

Здесь мы используем CMAKE_CURRENT_LIST_DIR переменная для доступа к каталогу, в котором находится текущий файл CMakeLists.txt.

target_link_libraries() используется для связывания одной библиотеки с другой библиотекой (или исполняемой), поэтому синтаксис должен включать как минимум два аргумента. Например, если вы хотите связать библиотеку stati c nanomsg с исполняемым файлом (например, MyExecutable), вы можете сделать это в CMake следующим образом:

add_library(nanomsg STATIC IMPORTED)

# Specify the nanomsg library's location and include directories.
set_target_properties(nanomsg PROPERTIES 
    IMPORTED_LOCATION "${CMAKE_CURRENT_LIST_DIR}/bin/lib/libnanomsg.a"
    INTERFACE_INCLUDE_DIRECTORIES "${CMAKE_CURRENT_LIST_DIR}/bin/include"
)

# Define your executable CMake target.
add_executable(MyExecutable main.cpp)

# Link the nanomsg library to the executable target.
target_link_libraries(MyExecutable PUBLIC nanomsg)
...