C ++ ile bağlayıcı dilini belirleyemiyor


90

Hem Visual Studio 2010 hem de Cygwin ile Windows 7 x64'te bir merhaba dünya programı çalıştırmaya çalışıyorum, ancak ikisi de işe yaramıyor gibi görünüyor. Dizin yapım aşağıdaki gibidir:

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

A ve cd buildardından a yazıyorum ve bunu cmake ..belirten bir hata alıyorum

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

Ancak, main.cpp uzantısını main.c olarak değiştirirsem hem filsistemde hem de src/CMakeLists.txther şey beklendiği gibi çalışır. Bu, hem Visual Studio Komut İstemi'nden (Visual Studio Solution Generator) hem de Cygwin Terminalinden (Unix Makefiles Generator) çalışan durumdur.

Bu kodun neden çalışmayacağına dair bir fikriniz var mı?

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;
}

"[...] main.cpp uzantısını değiştirirsem [...]" Onu neye değiştirirsiniz? .cc?
JAB

oops. Bunu kazara bıraktım. ".C" olarak değiştiriyorum. Orijinal yayında düzenlendi. Neredeyse bir cpp derleyicisi veya benzeri bir şey olmadığını düşündürüyor, ancak g ++ kullanılmıyor ve visual studio da c ++ ile sorun yaşamamalı.
Chris Covert

Yanıtlar:



184

Ayrıca bahsettiğiniz hatayı aldım:

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

Benim durumumda bu, .ccuzantıya sahip C ++ dosyalarına sahip olmasından kaynaklanıyordu .

CMake kodun dilini doğru bir şekilde belirleyemezse, aşağıdakileri kullanabilirsiniz:

set_target_properties(hello PROPERTIES LINKER_LANGUAGE CXX)

Dili project()ifadeye eklemeyi öneren kabul edilen yanıt, hangi dilin kullanıldığına dair daha katı bir kontrol ekler (belgelere göre), ancak bana yardımcı olmadı:

İsteğe bağlı olarak projenizin hangi dilleri desteklediğini belirleyebilirsiniz. Örnek diller CXX (yani C ++), C, Fortran vb'dir. Varsayılan olarak C ve CXX etkindir. Örneğin, bir C ++ derleyiciniz yoksa, desteklemek istediğiniz dilleri açıkça listeleyerek, örneğin C. "HİÇBİRİ" özel dilini kullanarak herhangi bir dil için tüm kontroller devre dışı bırakılabilir. CMAKE_PROJECT__INCLUDE_FILE adında bir değişken varsa, bu değişken tarafından gösterilen dosya proje komutunun son adımı olarak dahil edilecektir.


Benim durumumda, dosyamın bir .hpp uzantısı vardı. Bu sorunu çözdü!
brawner

Aynı benim için .hpp dosyası ve bu onu düzeltti.
KulaGGin

71

Benim durumumda, sadece hedefte kaynak dosya olmadığı içindi. Kitaplığımın tamamı, başlıkta kaynak kodlu şablondu. Boş bir file.cpp eklemek sorunu çözdü.


6
set target properties ayrıca cpp dosyası yok sorunu için de çalışır.
Denise Skidmore

1
Bahşiş için teşekkürler. Ayrıca kaynaklarımı srcyeni oluşturduğum projemin ilgili alt dizinine cmake(paylaşılan bir kitaplık) taşımayı unuttum ve bu temelde tüm sorunun nedeniydi. Bu gibi durumlarda, cmakeprojenizin yapısıyla ilgilenecek bir sihirbaza sahip olmak gerçekten hoşuna gider . : D
rbaleksandar

Burada da aynı sebep (kopyala-yapıştır hatası). Teşekkürler!
Vivit

2
Yararlı ipucu. "Kitaplığınız" yalnızca başlık olsa bile, #includeher dosya için bir .cpp dosyası oluşturmalısınız . Kitaplığınız derlendiğinde çıktı olmayacak olsa da, dosyanızın sözdizimi kontrolünü yapacak ve ayrıca gözden kaçırmış olabileceğiniz başlık bağımlılıklarını (örneğin sistem başlıkları) kontrol edecektir.
Mark Lakata

Bu kadar basit. Yoldaki yazım hatası, kaynaklarda * .cpp dosyalarının olmamasına neden olur. Ondan sonra her şey yolunda. Teşekkür ederim!
Rahul Das

17

Her ne kadar kafa karıştırıcı olsa da, hata projeye dahil edilen bir cpp dosyası olmadığında da ortaya çıkar.

Kaynak dosyalarınızı CMakeLists.txt'de listelerseniz ve yanlışlıkla bir dosya adı yazarsanız, bu hatayı alırsınız.


Lütfen bunu yorum bölümündeki gibi yapın.
Virb

1
Bu, diğer cevapların ne söylediğinden bağımsız olduğu için kendi cevabı olarak çalışır. Ayrıca bu sorunumu çözdü.
Czarking

5

OP'ye biraz ilgisiz bir cevap ama benim gibi insanlar için biraz benzer bir problem var.

Kullanım Örneği: Ubuntu (C, Clion, Otomatik tamamlama):

Ben de aynı hatayı yaptım

CMake Hatası: Hedef "merhaba" için bağlantı dili belirlenemiyor.

set_target_properties(hello PROPERTIES LINKER_LANGUAGE C) yardım bu sorunu çözer, ancak başlıklar projeye dahil edilmez ve otomatik tamamlama çalışmaz.

Bu sahip olduğum şey

cmake_minimum_required(VERSION 3.5)

project(hello)

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")

set(SOURCE_FILES ./)

add_executable(hello ${SOURCE_FILES})

set_target_properties(hello PROPERTIES LINKER_LANGUAGE C)

Hata yok ama ihtiyacım olan şey değil, kaynak olarak tek bir dosya eklemenin bana otomatik tamamlamayı getireceğini ve bağlayıcıyı ayarlayacağını fark ettim C.

cmake_minimum_required(VERSION 3.5)

project(hello)

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")

set(SOURCE_FILES ./1_helloworld.c)

add_executable(hello ${SOURCE_FILES})

C ++ standart sürümünü ayarlamak için CXX_FLAGS kullandığınızı fark ettim ve önerilen yolun cmake.org/cmake/help/latest/prop_tgt/CXX_STANDARD.html olduğunu düşündüğüm CXX_STANDARD değişkeninden bahsetmeyi düşündüm . cmake 3.5'te mevcut
Chris Covert

2

C tabanlı kodumu derlerken de benzer bir hatayla karşılaştım. Dosyamdaki kaynak dosya yolunu düzelterek sorunu düzelttim cmake. Lütfen dosyanızda bahsedilen her kaynak dosyanın kaynak dosya yolunu kontrol edin cmake. Bu da size yardımcı olabilir.


1

Herhangi bir kaynak dosyası olmayan bir kitaplığın oluşturulması durumunda başka bir çözüm eklemek istiyorum. Bu tür kitaplıklar, yalnızca başlık kitaplıkları olarak da bilinir . Varsayılan olarak add_libraryen az bir kaynak dosyanın eklenmesini bekler veya aksi halde belirtilen hata oluşur. Yalnızca başlık kitaplıkları oldukça yaygın olduğundan, INTERFACEbu tür kitaplıkları oluşturmak için cmake anahtar sözcüğüne sahiptir . INTERFACEAşağıda gösterildiği gibi anahtar kelime kullanılır ve kitaplığa eklenir boş kaynak dosyaları için gereksinimini ortadan kaldırır.

add_library(myLibrary INTERFACE)
target_include_directories(myLibrary INTERFACE {CMAKE_CURRENT_SOURCE_DIR})

Yukarıdaki örnek, CMakeLists.txt ile aynı dizindeki tüm başlık dosyalarını içeren bir yalnızca başlık kitaplığı oluşturacaktır. {CMAKE_CURRENT_SOURCE_DIR}Başlık dosyalarınızın CMakeLists.txt dosyasından farklı bir dizinde olması durumunda bir yolla değiştirin .

Yalnızca başlık kitaplıkları ve cmake ile ilgili daha fazla bilgi için bu blog gönderisine veya cmake belgelerine bir göz atın .


0

Varsayılan olarak JNI Native klasörü jni olarak adlandırılır . Bunu cpp olarak yeniden adlandırmak sorunu çözdü


-2

Değiştirerek benimkini çözmeyi başardım

add_executable(file1.cpp)

-e

add_executable(ProjectName file1.cpp)

-2

Benim durumumda, bir başlık dosyasında bir sınıfın üye işlevini uygulamak bu hataya neden oluyor. Arayüzün (xh dosyasında) ve uygulamanın (x.cpp dosyasında) ayrılması sorunu çözer.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.