2015-04-27 17 views
10

Tôi đang sử dụng CMake cho một dự án có hai phiên bản, một trong số đó yêu cầu -lglapi và một phiên bản khác thì không.Phụ thêm vào CMAKE_C_FLAGS

Cho đến nay các dòng chúng tôi sử dụng cái nhìn như thế:

SET(CMAKE_C_FLAGS "-O3 -xSSE3 -restrict -lpthread -lX11 -ldrm") 
SET(CMAKE_CXX_FLAGS "-O3 -xSSE3 -restrict -lpthread -lX11 -ldrm") 

tôi đã thêm một câu lệnh if trong CMakeList.txt của tôi chính xác sau khi những dòng:

if(SINGLE_MODE) 
    SET(CMAKE_C_FLAGS ${CMAKE_C_FLAGS} " -lglapi") 
    SET(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} " -lglapi") 
endif(SINGLE_MODE) 

Biến SINGLE_MODE được định nghĩa một chút lên. Khi tôi sử dụng lệnh nhắn để hiển thị nội dung của các biến cờ có vẻ ổn:

-O3 -xSSE3 -restrict -lpthread -lX11 -ldrm -lglapi 

Nhưng khi tôi bắt đầu biên soạn tôi chạy vào một lỗi biên dịch. Sử dụng chế độ tiết, tôi nhận ra rằng trong trình biên dịch, nó trông giống như sau:

-O3 -xSSE3 -restrict -lpthread -lX11 -ldrm; -lglapi 

I.e. bằng cách nào đó một dấu chấm phẩy đã được thêm vào trước khi thêm các -lglapi vào danh sách.

Có ai ở đây gặp phải sự cố tương tự và biết cách khắc phục sự cố này không? Tôi đã googled khá một thời gian và nghiên cứu hướng dẫn sử dụng CMake nhưng không thể nhìn thấy những gì tôi đã làm sai ở đây.

Cảm ơn, Tobias

+4

Bạn đã thử 'SET (CMAKE_CXX_FLAGS" $ {CMAKE_CXX_FLAGS} -lglapi ")' chưa? – jpo38

+0

@ jpo38 Bạn nên trả lời và nhận được danh tiếng xứng đáng của bạn :) – Antonio

+0

@ jpo38, cảm ơn bạn. Điều đó đã làm các trick. Nên tự mình nghĩ về điều đó nhưng sau khi nhìn vào thứ gì đó quá lâu, bạn sẽ bị mù vì điều đó. – TobiSF

Trả lời

14

Cố gắng làm điều này thay vì:

if(SINGLE_MODE) 
    SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -lglapi") 
    SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -lglapi") 
endif(SINGLE_MODE) 

Sau đó, bạn có chắc bạn nối thêm -lglapi đến ${CMAKE_CXX_FLAGS} chuỗi đang tồn tại. Khác, trông giống như một cái gì đó giống như một danh sách CMake đang được tạo ra.

+0

Đây là bản mẫu rất sôi nổi. Có giải pháp ngắn hơn không? – nowox

+0

@nowox: Không phải bất kỳ điều gì tôi biết về – jpo38

+0

Oh :(Tôi không thực sự biết CMake, nhưng không thể sử dụng 'danh sách (APPEND'? – nowox

0

Kể từ CMake 3.4 bạn làm:

string(APPEND CMAKE_CXX_FLAGS " -lglapi") 

này rất tiện dụng khi bạn muốn thiết lập các cờ chỉ cho một ngôn ngữ (C++ trong ví dụ trên), nhưng nếu bạn muốn thiết lập cờ tương tự cho tất cả các ngôn ngữ , bạn chỉ có thể làm:

add_compile_options(-lglapi) 

cả hai lệnh thay đổi những lá cờ cho toàn bộ thư mục, nếu bạn muốn thiết lập các cờ cho chỉ có một mục tiêu, làm:

target_compile_options(my_lib PUBLIC -lglapi) 

Cờ trên một mục tiêu có thể là PUBLIC, PRIVATE or INTERFACE, cho phép chuyển tiếp quá nhiều cờ từ một mục tiêu đến mục tiêu khác.

Các vấn đề liên quan