2013-01-15 13 views
9

Vì vậy, tôi đang xây dựng một thư viện được chia sẻ, trong số hai thư viện tĩnh.làm thế nào để đặt dòng lệnh trình biên dịch args ở những nơi cụ thể bằng cách sử dụng cmake

This answer nói cách cần làm là chèn -Wl,--whole-archive trước libs tĩnh của tôi, -Wl,--no-whole-archive sau chúng.

Vì vậy, những gì tôi có trong cmake tại thời điểm cho các thư viện chia sẻ là:

add_library(wittyPlus SHARED empty.cpp) 
target_link_libraries(wittyPlus 
    ${wtdbosqlite} 
    ${WT_LIBRARIES} 
    ${DB_LIBRARIES} 
    ${Boost_LIBRARIES} 
    app models 
) 

Vì vậy, những gì tôi cần là cho nó thêm -Wl,--whole-archive trước appmodels, sau đó -Wl,--no-whole-archive sau khi họ (để nhập thư viện chuẩn không được xuất bởi lib được chia sẻ).

Cách dễ nhất để làm điều này trong CMake là gì?


Addition: Vì vậy, tôi muốn sử dụng những thứ cmake tiêu chuẩn càng nhiều càng tốt, như vậy tôi không cần phải làm bất cứ việc làm thêm cho các cửa sổ được xây dựng, như CMake vui lòng loại bỏ các định nghĩa biên dịch không được hỗ trợ trên nền tảng đang được xây dựng.

Trả lời

14

OK, nó dễ hơn tôi tưởng.

Vì vậy, theo cmake docs:

tên mục bắt đầu bằng '-', nhưng không phải là '-l' hoặc '-framework', là coi là lá cờ mối liên kết.

Vì vậy, việc sửa chữa chỉ là để:

add_library(wittyPlus SHARED empty.cpp) 
target_link_libraries(wittyPlus 
    ${wtdbosqlite} 
    ${WT_LIBRARIES} 
    ${DB_LIBRARIES} 
    ${Boost_LIBRARIES} 
    "-Wl,--whole-archive" 
    app models 
    "-Wl,--no-whole-archive" 
) 

Tôi không biết nếu nó sẽ làm việc trên cửa sổ hay không, tôi hy vọng nó sẽ như cmake là siêu thông minh.

Nhìn vào kết quả với objdump, nó dường như có rất nhiều thứ tăng trong xuất khẩu, vì vậy tôi có thể làm điều gì đó sai trái.

objdump -C -t wittyPlus/libwittyPlus.so | grep -i boost 

Nhưng nó có những thứ tôi cần để liên kết với nó, đó là một bước tiến.

Bất kỳ câu trả lời nào khác vẫn được đánh giá cao. Về cơ bản những gì tôi đang cố gắng làm là giống như câu hỏi này:

CMake: how create a single shared library from all static libraries of subprojects?

+0

Bạn đã tìm thấy một tác phẩm xung quanh không yêu cầu tệp rỗng \ empty.cpp' không? –

+0

Không, tôi luôn sử dụng empty.cpp. – matiu

+3

Tôi có vẻ như bạn có thể làm 'tập tin (WRITE empty.cpp" ")' nếu bạn không muốn gây ô nhiễm cây nguồn thực của bạn với các tập tin rác. –

0

Nếu bạn đang xây dựng các thư viện tĩnh bản thân, bạn có thể sử dụng phương pháp này: https://stackoverflow.com/a/29824424/4069571 cụ thể là xây dựng chúng như các thư viện đối tượng đầu tiên, sau đó liên kết chúng vào các libs được chia sẻ và tĩnh tương ứng.