2012-08-03 27 views
36

Tôi đang cố gắng chạy chương trình thế giới chào cmake trên Windows 7 x64 với cả Visual Studio 2010 và Cygwin, nhưng dường như không thể làm việc. cấu trúc thư mục của tôi là như sau:CMake không thể xác định ngôn ngữ liên kết với C++

HelloWorld 
-- CMakeLists.txt 
-- src/ 
-- -- CMakeLists.txt 
-- -- main.cpp 
-- build/ 

tôi làm một cd build theo sau là một cmake .., và nhận được một lỗi nói rằng

CMake Error: CMake can not determine linker language for target:helloworld 
CMake Error: Cannot determine link language for target "helloworld". 

Tuy nhiên, nếu tôi thay đổi phần mở rộng của main.cpp to main. c cả trên hệ thống tệp của tôi và trong src/CMakeLists.txt mọi thứ hoạt động như mong đợi. Đây là trường hợp chạy từ cả Visual Studio Command Prompt (Visual Studio Solution Generator) và Cygwin Terminal (Unix Makefiles Generator).

Bất kỳ ý tưởng nào tại sao mã này sẽ không hoạt động?

CMakeLists.txt

PROJECT(HelloWorld C) 
cmake_minimum_required(VERSION 2.8) 

# include the cmake modules directory 
set(CMAKE_MODULE_PATH ${HelloWorld_SOURCE_DIR}/cmake ${CMAKE_MODULE_PATH}) 

add_subdirectory(src) 

src/CMakeLists.txt

# Include the directory itself as a path to include directories 
set(CMAKE_INCLUDE_CURRENT_DIR ON) 

# Create a variable called helloworld_SOURCES containing all .cpp files: 
set(HelloWorld_SOURCES main.cpp) 

# Create an executable file called helloworld from sources: 
add_executable(hello ${HelloWorld_SOURCES }) 

src/main.cpp

int main() 
{ 
    return 0; 
} 
+0

"[...] nếu tôi thay đổi phần mở rộng của main.cpp [...]" Bạn thay đổi nó thành gì? .cc? – JAB

+0

oops. Trái đó ra một cách tình cờ. Tôi đổi nó thành '.c'. Đã chỉnh sửa trong bài đăng gốc. Nó gần như làm cho tôi nghĩ rằng không có một trình biên dịch cpp hoặc một cái gì đó của loại, nhưng g + + là insalled và studio trực quan không nên có vấn đề với c + + hoặc. –

Trả lời

23

Hãy thử thay đổi

PROJECT(HelloWorld C) 

vào

PROJECT(HelloWorld C CXX) 

hoặc chỉ

PROJECT(HelloWorld) 

Xem: http://www.cmake.org/cmake/help/v2.8.8/cmake.html#command:project

+0

Điều đó sẽ làm được. Tôi biết tôi đã làm điều gì đó ngu ngốc. Cảm ơn! –

+1

Điều này không hữu ích cho tôi. Lỗi liên kết vẫn còn, xem câu trả lời của tôi những gì đã giúp sửa chữa nó. – Joakim

72

Tôi cũng đã nhận lỗi bạn đề cập đến:

CMake Error: CMake can not determine linker language for target:helloworld 
CMake Error: Cannot determine link language for target "helloworld". 

Trong trường hợp của tôi điều này là do có C++ các tệp có phần mở rộng là .cc.

Nếu CMake là không thể xác định ngôn ngữ của mã một cách chính xác, bạn có thể sử dụng như sau:

set_target_properties(hello PROPERTIES LINKER_LANGUAGE CXX) 

Câu trả lời được chấp nhận gợi ý rằng phụ thêm ngôn ngữ để báo cáo kết quả project() chỉ cần thêm kiểm tra nghiêm ngặt hơn đối với những gì ngôn ngữ là được sử dụng (theo tài liệu), nhưng nó không hữu ích cho tôi:

Tùy chọn bạn có thể chỉ định ngôn ngữ mà dự án của bạn hỗ trợ. Các ngôn ngữ mẫu là CXX (ví dụ: C++), C, Fortran, v.v. Theo mặc định, C và CXX được bật. Ví dụ. nếu bạn không có trình biên dịch C++, bạn có thể vô hiệu hóa séc bằng cách liệt kê rõ ràng các ngôn ngữ bạn muốn để hỗ trợ, ví dụ: C. Bằng cách sử dụng ngôn ngữ đặc biệt "KHÔNG" tất cả các kiểm tra cho bất kỳ ngôn ngữ có thể bị vô hiệu hóa. Nếu biến tồn tại được gọi là CMAKE_PROJECT__INCLUDE_FILE, tệp được trỏ đến bởi biến số này sẽ được bao gồm làm bước cuối cùng của lệnh dự án.

22

Trong trường hợp của tôi, đó là do không có tệp nguồn trong mục tiêu. Tất cả thư viện của tôi là mẫu có mã nguồn trong tiêu đề. Thêm tệp rỗng.cpp đã giải quyết được sự cố.

+4

đặt thuộc tính đích cũng hoạt động cho vấn đề không có tệp cpp. –

+0

Kudo cho mẹo. Tôi cũng đã quên di chuyển các nguồn của mình tới thư mục con 'src' tương ứng của dự án' cmake' mới được tạo ra của tôi (một thư viện được chia sẻ) và đây là nguyên nhân cơ bản của toàn bộ vấn đề. Trong những trường hợp như vậy, người ta thực sự đánh giá cao việc có một trình thủ thuật để quản lý cấu trúc của dự án 'cmake' của bạn. : D – rbaleksandar

+0

Cùng một lý do ở đây (sao chép-dán sai lầm). Cảm ơn! – Vivit

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