C++ 如何在CMakeList.txt中链接-ldl
我试图在ubuntu 14.04下的Clion中编写一个CMakeList.txt,如下所示:C++ 如何在CMakeList.txt中链接-ldl,c++,makefile,C++,Makefile,我试图在ubuntu 14.04下的Clion中编写一个CMakeList.txt,如下所示: cmake_minimum_required(VERSION 2.8.3) project(ify) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pthread -std=c++11") ## System dependencies are found with CMake's conventions find_package(Boost REQUIRED)
cmake_minimum_required(VERSION 2.8.3)
project(ify)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pthread -std=c++11")
## System dependencies are found with CMake's conventions
find_package(Boost REQUIRED)
include_directories(
${catkin_INCLUDE_DIRS}
/usr/local/include
/usr/include
include
)
include_directories(
include/
)
link_directories(
/usr/local/lib
/usr/lib
libs/x64
/usr/lib/x86_64-linux-gnu
)
#set(SOURCE_FILES main.cpp)
#add_executable(ify ${SOURCE_FILES})
add_executable(ify main.cpp)
target_link_libraries(ify ${catkin_LIBRARIES}
libmsc.so
libasound.so
)
当我运行时,它告诉我:
/home/think/ClionProjects/ify/libs/x64/libmsc.so: undefined reference to `dlopen'
/home/think/ClionProjects/ify/libs/x64/libmsc.so: undefined reference to `dlclose'
/home/think/ClionProjects/ify/libs/x64/libmsc.so: undefined reference to `dlerror'
/home/think/ClionProjects/ify/libs/x64/libmsc.so: undefined reference to `dlsym'
/home/think/ClionProjects/ify/libs/x64/libmsc.so: undefined reference to `pthread_create'
在我搜索了这个之后,我尝试了一些方法:
1:像这样添加低密度脂蛋白:
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pthread -ldl -std=c++11")
DIR_INC = ./include
DIR_BIN = ./bin
DIR_LIB = ./libs
TARGET = demo
BIN_TARGET = $(DIR_BIN)/$(TARGET)
CROSS_COMPILE =
CFLAGS = -g -Wall -I$(DIR_INC)
#
ifdef LINUX64
LDFLAGS := -L$(DIR_LIB)/x64
else
LDFLAGS := -L$(DIR_LIB)/x86
endif
LDFLAGS += -lmsc -lrt -ldl -lpthread
OBJECTS := $(patsubst %.c,%.o,$(wildcard *.c))
$(BIN_TARGET) : $(OBJECTS)
$(CROSS_COMPILE)gcc $(CFLAGS) $^ -o $@ $(LDFLAGS)
%.o : %.c
$(CROSS_COMPILE)gcc -c $(CFLAGS) $< -o $@
clean:
@rm -f *.o $(BIN_TARGET)
.PHONY:clean
target_link_libraries(ify ${catkin_LIBRARIES}
libmsc.so
libasound.so
rt
${CMAKE_DL_LIBS}
${CMAKE_THREAD_LIBS_INIT}
)
2:添加目标链接库:
target_link_libraries(ify
dl
pthread
)
3:
4:在main.cpp中添加#包括
但这两种方法都不起作用
然后我尝试在没有clion的情况下编译它,并在文件夹中编写了一个MakeFile,如下所示:
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pthread -ldl -std=c++11")
DIR_INC = ./include
DIR_BIN = ./bin
DIR_LIB = ./libs
TARGET = demo
BIN_TARGET = $(DIR_BIN)/$(TARGET)
CROSS_COMPILE =
CFLAGS = -g -Wall -I$(DIR_INC)
#
ifdef LINUX64
LDFLAGS := -L$(DIR_LIB)/x64
else
LDFLAGS := -L$(DIR_LIB)/x86
endif
LDFLAGS += -lmsc -lrt -ldl -lpthread
OBJECTS := $(patsubst %.c,%.o,$(wildcard *.c))
$(BIN_TARGET) : $(OBJECTS)
$(CROSS_COMPILE)gcc $(CFLAGS) $^ -o $@ $(LDFLAGS)
%.o : %.c
$(CROSS_COMPILE)gcc -c $(CFLAGS) $< -o $@
clean:
@rm -f *.o $(BIN_TARGET)
.PHONY:clean
target_link_libraries(ify ${catkin_LIBRARIES}
libmsc.so
libasound.so
rt
${CMAKE_DL_LIBS}
${CMAKE_THREAD_LIBS_INIT}
)
DIR_INC=/包括
DIR_BIN=/BIN
目录库=./libs
目标=演示
BIN\u TARGET=$(DIR\u BIN)/$(TARGET)
交叉编译=
CFLAGS=-g-Wall-I$(迪鲁公司)
#
ifdef LINUX64
LDFLAGS:=-L$(目录库)/x64
其他的
LDFLAGS:=-L$(目录库)/x86
恩迪夫
LDFLAGS+=-lmsc-lrt-ldl-lpthread
对象:=$(patsubst%.c、%.o、$(通配符*.c))
$(BIN_目标):$(对象)
$(交叉编译)gcc$(CFLAGS)$^-o$@$(LDFLAGS)
%.o:%.c
$(交叉编译)gcc-c$(CFLAGS)$<-o$@
清洁:
@rm-f*.o$(银行目标)
.假冒:干净
这个Makefile可以工作,我想这是因为这句话:LDFLAGS+=-lmsc-lrt-ldl-lpthread
,但是我如何在clion中更改我的CMakefile.txt,我希望它在clion中工作。
有人能帮我吗?非常感谢。请尝试以下方法:
target_link_libraries(ify ${catkin_LIBRARIES} libmsc.so libasound.so libdl.so)
target_link_libraries(ify ${catkin_LIBRARIES} libmsc.so libasound.so ${CMAKE_DL_LIBS})
或者(更好)这样:
target_link_libraries(ify ${catkin_LIBRARIES} libmsc.so libasound.so libdl.so)
target_link_libraries(ify ${catkin_LIBRARIES} libmsc.so libasound.so ${CMAKE_DL_LIBS})
根据添加以下内容以查找cmake 2.8.12的pthread
:
find_package(Threads REQUIRED)
然后,您的目标链接库应如下所示:
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pthread -ldl -std=c++11")
DIR_INC = ./include
DIR_BIN = ./bin
DIR_LIB = ./libs
TARGET = demo
BIN_TARGET = $(DIR_BIN)/$(TARGET)
CROSS_COMPILE =
CFLAGS = -g -Wall -I$(DIR_INC)
#
ifdef LINUX64
LDFLAGS := -L$(DIR_LIB)/x64
else
LDFLAGS := -L$(DIR_LIB)/x86
endif
LDFLAGS += -lmsc -lrt -ldl -lpthread
OBJECTS := $(patsubst %.c,%.o,$(wildcard *.c))
$(BIN_TARGET) : $(OBJECTS)
$(CROSS_COMPILE)gcc $(CFLAGS) $^ -o $@ $(LDFLAGS)
%.o : %.c
$(CROSS_COMPILE)gcc -c $(CFLAGS) $< -o $@
clean:
@rm -f *.o $(BIN_TARGET)
.PHONY:clean
target_link_libraries(ify ${catkin_LIBRARIES}
libmsc.so
libasound.so
rt
${CMAKE_DL_LIBS}
${CMAKE_THREAD_LIBS_INIT}
)
希望这有帮助。奇怪,目标链接库(dl#somethingelse)
应该可以工作。我也有同样的问题。到目前为止,您已经解决了这个问题吗?谢谢,我尝试了这两种方法,我得到了与以前相同的错误。只是好奇,但您是否在执行此操作之前清除了cake缓存?使用VERBOSE=yes构建并检查库是否已添加Hanks,我清除了cake缓存并尝试了此方法,但得到了相同的错误。这很奇怪。@thiiiiiiking:CMakeLists.txt文件与工作的Makefile在同一目录下吗?您使用的是什么版本的cmake?运行cmake时,它是否抱怨找不到pthread或dl?是的,它们位于同一目录中。cmake的版本是2.8.12,它没有抱怨没有找到pthread
或dl
@thiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii。有关您的版本,请参阅。我会更新答案。希望来自pthread的未定义引用将消失。您是否仍然从DL获得未定义的引用?@ TIIIIKIG: BTW,您可能需要考虑更新您的CMASE到最新版本。