Tôi Ubuntu, tôi đang tìm hiểu về cmake và thực hiện, và chỉ cần thử một ví dụ đơn giản. Tôi có hai thư mục: src
và build
. Trong src
, tôi có hai tập tin: main.cpp
, và CMakeLists.txt
, trong đó có (chỉ) các văn bản sau đây:Cmake không thể tìm thấy thư viện bằng cách sử dụng "link_directories"
add_executable(test main.cpp)
link_directories(/usr/lib/x86_64-linux-gnu)
target_link_libraries(test protobuf)
trong /usr/lib/x86_64-linux-gnu
, có một thư viện chia sẻ gọi libprotobuf.so
, mà tôi muốn liên kết chống lại. My main.cpp
sử dụng các chức năng trong thư viện này, bằng cách bao gồm tệp tiêu đề có liên quan, #include <google/protobuf/message.h>
.
Bây giờ, trong thư mục build
của tôi, tôi chạy cmake ../src
và sau đó make
. Tuy nhiên, sau đó tôi nhận được các lỗi liên kết cho tôi biết rằng có các tham chiếu không xác định đối với một số hàm trong thư viện protobuf. Nếu tôi thực hiện tìm kiếm thông qua tất cả các tệp và thư mục con trong build
, thì không có đề cập đến bất kỳ điều gì liên quan đến protobuf.
Tuy nhiên, nếu tôi xóa dòng link_directories
trong tệp CMakeLists.txt
của mình và thay vào đó ghi đường dẫn đầy đủ vào thư viện khi chỉ định tệp thực thi, tức là target_link_libraries(test /usr/lib/x86_64-linux-gnu/libprotobuf.so)
, nó biên dịch và liên kết tốt.
Tại sao link_directories
không cho phép cmake tìm thư viện này?
Hướng dẫn sử dụng cmake nói về link_libraries "Lệnh sẽ chỉ áp dụng cho các mục tiêu được tạo sau khi nó được gọi." Mục tiêu có được tạo bằng lệnh add_executable() không? Có lẽ bạn cần phải di chuyển lệnh add_executable() sau link_directories(). – Alain
Nếu tôi làm điều này, tôi nhận được lỗi "Không thể chỉ định thư viện liên kết cho mục tiêu" thử nghiệm "mà không được xây dựng bởi dự án này.' – Karnivaurus
Chỉ cần chắc chắn: thứ tự của lệnh của bạn bây giờ là 1) link_directories(), 2) add_executable() và 3) target_link_libraries()? – Alain