在源代码安装cURL后,我需要在Ubuntu 11.04中链接cURL。
首先我发现 -l </ em>必须在 -L 之前,然后发现我没有在makefile中输入变量。
在我的期刊上:
# curl-config --libs
-L/usr/local/lib -lcurl
# curl-config --cflags
-I/usr/local/include
没关系,这个目录里有文件cURL。
# Testing cURL
# MAKEFILE
# C++ Compiler (Default: g++)
CXX = g++
CFLAGS = -Wall -Werror
# Librarys
INCLUDE = -Iusr/local/include
LDFLAGS = -Lusr/local/lib
LDLIBS = -lcurl
# Details
SOURCES = src/main.cpp
OUT = test
all: build
build: $(SOURCES)
$(CXX) -o $(OUT) $(INCLUDE) $(CFLAGS) $(LDFLAGS) $(SOURCES)
#include <iostream>
#include <curl/curl.h>
int main( void )
{
CURL *curl;
CURLcode res;
curl = curl_easy_init();
if(curl) {
curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
res = curl_easy_perform(curl);
curl_easy_cleanup(curl);
}
return 0;
}
# make
g++ -o test -Iusr/local/include -Wall -Werror -Lusr/local/lib src/main.cpp
/tmp/ccli90i2.o: In function `main':
main.cpp:(.text+0xa): undefined reference to `curl_easy_init'
main.cpp:(.text+0x31): undefined reference to `curl_easy_setopt'
main.cpp:(.text+0x3d): undefined reference to `curl_easy_perform'
main.cpp:(.text+0x4d): undefined reference to `curl_easy_cleanup'
collect2: ld returned 1 exit status
make: ** [build] Erro 1
我知道这是找不到图书馆的错误,但对我来说一切都是正确的
答案 0 :(得分:4)
这应该可以胜任。你以前没有真正链接到cURL。
build: $(SOURCES)
$(CXX) -o $(OUT) $(INCLUDE) $(CFLAGS) $(LDFLAGS) $(LDLIBS) $(SOURCES)
请注意已添加 $(LDLIBS)
。
哦,我应该补充一点,基本上发生的事情就是你抛弃GNU make的内置规则(参见make -np
的输出)并定义你自己的。我建议您使用内置的,如果您想依赖各自的变量来控制构建,或者为了简洁起见,您仍然将其拆分为编译和链接步骤。
简要说明:GNU make附带一条规则,说明如何从.o
(或.cpp
)文件制作.c
文件。所以你的make文件也许可以重写为(大约)
# Testing cURL
# MAKEFILE
# C++ Compiler (Default: g++)
CXX = g++
CFLAGS = -Wall -Werror
# Librarys
INCLUDE = -I/usr/local/include
LDFLAGS = -L/usr/local/lib
LDLIBS = -lcurl
# Details
SOURCES = src/main.cpp
OUT = test
.PHONY: all
all: build
$(OUT): $(patsubst %.cpp,%.o,$(SOURCES))
这应该生成名为test
的二进制文件(OUT
的内容),否则使用内置规则。通过使用必须有源文件的.o
文件,可以查找并编译它们。因此,隐式地,此构建将为每个.cpp
文件运行一次调用,并为链接步骤运行一次。
答案 1 :(得分:0)
您在下面的路径开头缺少斜杠
-I/usr/local/include
-L/usr/local/lib