【问题标题】:Linking cURL in Makefile在 Makefile 中链接 cURL
【发布时间】:2011-09-29 20:55:17
【问题描述】:

通过源代码安装 cURL 后,我需要在 Ubuntu 11.04 中链接 cURL。

.

问题的更正

首先我发现 -l 必须在 -L 之前,然后发现我没有在 makefile 中输入变量。

.

获取 cURL 配置:

在我的终端上:

# curl-config --libs
-L/usr/local/lib -lcurl

# curl-config --cflags
-I/usr/local/include

没关系,这个目录哪里有cURL文件。


我的 Makefile:

# 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)

我的 C++ 源代码:

#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

我知道这是找不到库的错误,但对我来说一切都是正确的

【问题讨论】:

  • 为什么说查找库出错?您甚至没有传递 -lcurl (或链接器的适当值)。那不会是问题吗?目前链接器不会尝试根据命令行查找库...

标签: c++ curl linker makefile


【解决方案1】:

这应该可以完成工作。您之前并没有真正链接到 cURL。

build: $(SOURCES)
    $(CXX) -o $(OUT) $(INCLUDE) $(CFLAGS) $(LDFLAGS) $(LDLIBS) $(SOURCES)

注意添加 $(LDLIBS)

哦,我应该补充一点,基本上发生的事情是你抛弃了 GNU make 的内置规则(参见make -np 的输出)并定义你自己的规则。如果您想依靠各自的变量足以控制构建,或者为了简洁起见,您仍将其拆分为编译和链接步骤,我建议您使用内置变量。

简要说明:GNU make 附带一条规则,说明如何从.cpp(或.c)文件创建.o 文件。因此,您的 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))

这应该生成名称为testOUT 的内容)的二进制文件,否则将使用内置规则。通过使用.o 文件推断必须有源文件,将查找它们并编译它们。因此,这个构建会隐含地为每个 .cpp 文件运行一次调用,并为链接步骤运行一次。

【讨论】:

    【解决方案2】:

    您在以下路径的开头缺少斜杠

    -I/usr/local/include
    -L/usr/local/lib
    

    【讨论】:

    • 我在没有它们的情况下运行,但最好放上它们。
    • @Bruno:如果那是绝对路径,那是绝对必要的。否则,如果库和包含的路径是相对于 $(CURDIR) 你应该没问题。
    猜你喜欢
    • 2012-09-12
    • 1970-01-01
    • 1970-01-01
    • 2010-11-21
    • 2017-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多