C++ 如何在CMakeList.txt中链接-ldl

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)

我试图在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)

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到最新版本。