Estoy intentando ejecutar un programa cmake hello world en Windows 7 x64 con Visual Studio 2010 y Cygwin, pero parece que ninguno de los dos funciona. Mi estructura de directorio es la siguiente:
HelloWorld
-- CMakeLists.txt
-- src/
-- -- CMakeLists.txt
-- -- main.cpp
-- build/
Hago una cd build
seguida de una cmake ..
, y obtengo un error que indica que
CMake Error: CMake can not determine linker language for target:helloworld
CMake Error: Cannot determine link language for target "helloworld".
Sin embargo, si cambio la extensión de main.cpp a main.c tanto en mi sistema de archivos como en src/CMakeLists.txt
todo, funciona como se esperaba. Este es el caso que se ejecuta tanto desde Visual Studio Command Prompt (Visual Studio Solution Generator) como desde Cygwin Terminal (Unix Makefiles Generator).
¿Alguna idea de por qué este código no funcionaría?
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;
}
Respuestas:
Intenta cambiar
PROJECT(HelloWorld C)
dentro
PROJECT(HelloWorld C CXX)
o solo
PROJECT(HelloWorld)
Ver: http://www.cmake.org/cmake/help/v2.8.8/cmake.html#command:project
fuente
También recibí el error que mencionas:
CMake Error: CMake can not determine linker language for target:helloworld CMake Error: Cannot determine link language for target "helloworld".
En mi caso, esto se debió a tener archivos C ++ con la
.cc
extensión.Si CMake no puede determinar el idioma del código correctamente, puede utilizar lo siguiente:
set_target_properties(hello PROPERTIES LINKER_LANGUAGE CXX)
La respuesta aceptada que sugiere agregar el idioma a la
project()
declaración simplemente agrega una verificación más estricta del idioma que se usa (de acuerdo con la documentación), pero no fue útil para mí:fuente
En mi caso, fue solo porque no había ningún archivo fuente en el destino. Toda mi biblioteca era una plantilla con código fuente en el encabezado. Agregar un archivo.cpp vacío resolvió el problema.
fuente
src
subdirectorio respectivo de micmake
proyecto recién creado (una biblioteca compartida) y esta fue básicamente la causa de todo el problema. En tales casos, uno realmente aprecia tener un asistente que se encargue de la estructura de sucmake
proyecto. : D#include
para cada archivo. Aunque no habrá salida cuando se compile su biblioteca, comprobará la sintaxis de su archivo y también comprobará las dependencias del encabezado (por ejemplo, los encabezados del sistema) que puede haber pasado por alto.Por confuso que pueda ser, el error también ocurre cuando un archivo cpp incluido en el proyecto no existe.
Si enumera sus archivos de origen en CMakeLists.txt y escribe por error un nombre de archivo, obtendrá este error.
fuente
Una respuesta un poco no relacionada con OP pero para personas como yo con un problema algo similar.
Caso de uso: Ubuntu (C, Clion, Autocompletar):
Yo tenía el mismo error,
set_target_properties(hello PROPERTIES LINKER_LANGUAGE C)
ayuda a solucionar ese problema, pero los encabezados no están incluidos en el proyecto y el autocompletado no funcionará.Esto es lo que tuve
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)
No hay errores, pero no lo que necesitaba, me di cuenta de que incluir un solo archivo como fuente me permitirá completar automáticamente y establecerá el vinculador en
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})
fuente
También enfrenté un error similar al compilar mi código basado en C. Solucioné el problema corrigiendo la ruta del archivo de origen en mi
cmake
archivo. Compruebe la ruta del archivo de origen de cada archivo de origen mencionado en sucmake
archivo. Esto también podría ayudarte.fuente
De forma predeterminada, la carpeta nativa de JNI se denomina jni . Cambiar el nombre a cpp solucionó el problema
fuente
Quiero agregar otra solución en caso de que se construya una biblioteca sin archivos fuente. Estas bibliotecas también se conocen como bibliotecas de encabezado . De forma predeterminada, se
add_library
espera que se agregue al menos un archivo fuente o, de lo contrario, se produce el error mencionado. Dado que las bibliotecas de encabezado son bastante comunes, cmake tiene laINTERFACE
palabra clave para construir dichas bibliotecas. LaINTERFACE
palabra clave se usa como se muestra a continuación y elimina la necesidad de agregar archivos fuente vacíos a la biblioteca.add_library(myLibrary INTERFACE) target_include_directories(myLibrary INTERFACE {CMAKE_CURRENT_SOURCE_DIR})
El ejemplo anterior crearía una biblioteca de solo encabezado que incluye todos los archivos de encabezado en el mismo directorio que CMakeLists.txt. Reemplazar
{CMAKE_CURRENT_SOURCE_DIR}
con una ruta en caso de que sus archivos de encabezado estén en un directorio diferente al archivo CMakeLists.txt.Eche un vistazo a esta publicación de blog o la documentación de cmake para obtener más información sobre las bibliotecas de solo encabezado y cmake.
fuente
Logré solucionar el mío, cambiando
add_executable(file1.cpp)
a
add_executable(ProjectName file1.cpp)
fuente
En mi caso, implementar una función miembro de una clase en un archivo de encabezado causa este error. Separar la interfaz (en el archivo xh) y la implementación (en el archivo x.cpp) resuelve el problema.
fuente