javascript

java

python

c#

android

c++

node.js

php

html

jquery

ios

reactjs

css

.net

git

ruby-on-rails

sql

c

ruby

string

具有模板的C ++共享库:未定义符号

我正在尝试使用模板类链接到共享库,但这给了我“未定义符号”错误。 我将问题压缩为大约20行代码。

共享的

template <class Type> class myclass {
  Type x;
public:
  myclass() { x=0; }
  void setx(Type y);
  Type  getx();
};

共享的

#include "shared.h"
template <class Type> void myclass<Type>::setx(Type y) { x = y; }
template <class Type> Type myclass<Type>::getx() { return x; }

main.cpp

#include <iostream>
#include "shared.h"
using namespace std;

int main(int argc, char *argv[]) {
   myclass<int> m;
   cout << m.getx() << endl;
   m.setx(10);
   cout << m.getx() << endl;
   return 0;
}

这是我编译库的方式:

g++ -fPIC -c shared.cpp -o shared.o
g++ -dynamiclib -Wl,-dylib_install_name -Wl,libshared.dylib -o libshared.dylib shared.o

和主程序:

g++ -c main.cpp
g++ -o main  main.o -L. -lshared

仅得到以下错误:

Undefined symbols:
"myclass<int>::getx()", referenced from:
  _main in main.o
  _main in main.o
"myclass<int>::setx(int)", referenced from:
  _main in main.o

如果我删除shared.h/cpp中的“模板”内容,并仅用“整数”替换它们,那么一切正常。 另外,如果我只将模板类代码复制并粘贴到main.cpp中,并且不链接到共享库,那么一切也将正常运行。

如何获得这样的模板类以通过共享库工作?

我将MacOS 10.5和GCC 4.0.1一起使用。

trans by 2020-08-12T04:43:22Z

首页> C#>如何使用不带-l或不遵循libNAME.so命名约定的库的硬编码路径的GCC进行链接?

我有一个共享库,希望将其链接为使用GCC的可执行文件。 共享库具有非标准名称,其格式不是libNAME.so,因此我不能使用通常的-l选项。 (它碰巧也是Python扩展,因此没有“ lib”前缀。)

我能够将库文件的路径直接传递给链接命令行,但这会导致库路径被硬编码到可执行文件中。

例如:

g++ -o build/bin/myapp build/bin/_mylib.so

有没有一种方法可以链接到该库而不会导致路径被硬编码到可执行文件中?

trans by 2020-08-11T21:38:43Z

C ++-无法解析的外部符号LNK2019

首先,我知道这个问题遍及整个网站,但我已经查看了几乎所有问题,似乎无法找出问题所在。 这是VS2012。谢谢。

//Socket.h
#pragma once

#include <iostream>
#include <WinSock2.h>

using namespace std;

const int STRLEN = 256;

class Socket
{
    protected:
        WSADATA wsaData;
        SOCKET mySocket;
        SOCKET myBackup;
        SOCKET acceptSocket;
        sockaddr_in myAddress;
    public:
        Socket();
        ~Socket();
        bool SendData( char* );
        bool RecvData( char*, int );
        void CloseConnection();
        void GetAndSendMessage();
};

class ServerSocket : public Socket
{
    public:
        void Listen();
        void Bind( int port );
        void StartHosting( int port );
};

class ClientSocket : public Socket
{
    public:
        void ConnectToServer( const char *ipAddress, int port );
};

这是Socket.cpp

//Socket.cpp


#include "stdafx.h"
#include "Socket.h"


Socket::Socket()
{
    if( WSAStartup( MAKEWORD(2, 2), &wsaData ) != NO_ERROR )
    {
        cerr<<"Socket Initialization: Error with WSAStartup\n";
        system("pause");
        WSACleanup();
        exit(10);
    }

    //Create a socket
    mySocket = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP );

    if ( mySocket == INVALID_SOCKET )
    {
        cerr<<"Socket Initialization: Error creating socket"<<endl;
        system("pause");
        WSACleanup();
        exit(11);
    }

    myBackup = mySocket;
}

Socket::~Socket()
{
    WSACleanup();
}

bool Socket::SendData( char *buffer )
{
    send( mySocket, buffer, strlen( buffer ), 0 );
    return true;
}

bool Socket::RecvData( char *buffer, int size )
{
    int i = recv( mySocket, buffer, size, 0 );
    buffer[i] = '\0';
    return true;
}

void Socket::CloseConnection()
{
    //cout<<"CLOSE CONNECTION"<<endl;
    closesocket( mySocket );
    mySocket = myBackup;
}

void Socket::GetAndSendMessage()
{
    char message[STRLEN];
    cin.ignore();//without this, it gets the return char from the last cin and ignores the following one!
    cout<<"Send > ";
    cin.get( message, STRLEN );
    SendData( message );
}

void ServerSocket::StartHosting( int port )
{
     Bind( port );
     Listen();
}

void ServerSocket::Listen()
{
    //cout<<"LISTEN FOR CLIENT..."<<endl;

    if ( listen ( mySocket, 1 ) == SOCKET_ERROR )
    {
        cerr<<"ServerSocket: Error listening on socket\n";
        system("pause");
        WSACleanup();
        exit(15);
    }

    //cout<<"ACCEPT CONNECTION..."<<endl;

    acceptSocket = accept( myBackup, NULL, NULL );
    while ( acceptSocket == SOCKET_ERROR )
    {
        acceptSocket = accept( myBackup, NULL, NULL );
    }
    mySocket = acceptSocket;
}

void ServerSocket::Bind( int port )
{
    myAddress.sin_family = AF_INET;
    myAddress.sin_addr.s_addr = inet_addr( "0.0.0.0" );
    myAddress.sin_port = htons( port );

    //cout<<"BIND TO PORT "<<port<<endl;

    if ( bind ( mySocket, (SOCKADDR*) &myAddress, sizeof( myAddress) ) == SOCKET_ERROR )
    {
        cerr<<"ServerSocket: Failed to connect\n";
        system("pause");
        WSACleanup();
        exit(14);
    }
}

void ClientSocket::ConnectToServer( const char *ipAddress, int port )
{
    myAddress.sin_family = AF_INET;
    myAddress.sin_addr.s_addr = inet_addr( ipAddress );
    myAddress.sin_port = htons( port );

    //cout<<"CONNECTED"<<endl;

    if ( connect( mySocket, (SOCKADDR*) &myAddress, sizeof( myAddress ) ) == SOCKET_ERROR )
    {
        cerr<<"ClientSocket: Failed to connect\n";
        system("pause");
        WSACleanup();
        exit(13);
    } 

}

这是stdafx.h

#pragma once

#include "targetver.h"

#define WIN32_LEAN_AND_MEAN             // Exclude rarely-used stuff from Windows headers
// Windows Header Files:
#include <windows.h>

// C RunTime Header Files
#include <stdlib.h>
#include <malloc.h>
#include <memory.h>
#include <tchar.h>


// TODO: reference additional headers your program requires here
#include "Socket.h"

这是我的错误消息:

1>------ Build started: Project: Client, Configuration: Debug Win32 ------
1>  stdafx.cpp
1>  Socket.cpp
1>  Client.cpp
1>  Generating Code...
1>Socket.obj : error LNK2019: unresolved external symbol __imp__accept@12 referenced in function "public: void __thiscall ServerSocket::Listen(void)" (?Listen@ServerSocket@@QAEXXZ)
1>Socket.obj : error LNK2019: unresolved external symbol __imp__bind@12 referenced in function "public: void __thiscall ServerSocket::Bind(int)" (?Bind@ServerSocket@@QAEXH@Z)
1>Socket.obj : error LNK2019: unresolved external symbol __imp__closesocket@4 referenced in function "public: void __thiscall Socket::CloseConnection(void)" (?CloseConnection@Socket@@QAEXXZ)
1>Socket.obj : error LNK2019: unresolved external symbol __imp__connect@12 referenced in function "public: void __thiscall ClientSocket::ConnectToServer(char const *,int)" (?ConnectToServer@ClientSocket@@QAEXPBDH@Z)
1>Socket.obj : error LNK2019: unresolved external symbol __imp__htons@4 referenced in function "public: void __thiscall ServerSocket::Bind(int)" (?Bind@ServerSocket@@QAEXH@Z)
1>Socket.obj : error LNK2019: unresolved external symbol __imp__inet_addr@4 referenced in function "public: void __thiscall ServerSocket::Bind(int)" (?Bind@ServerSocket@@QAEXH@Z)
1>Socket.obj : error LNK2019: unresolved external symbol __imp__listen@8 referenced in function "public: void __thiscall ServerSocket::Listen(void)" (?Listen@ServerSocket@@QAEXXZ)
1>Socket.obj : error LNK2019: unresolved external symbol __imp__recv@16 referenced in function "public: bool __thiscall Socket::RecvData(char *,int)" (?RecvData@Socket@@QAE_NPADH@Z)
1>Socket.obj : error LNK2019: unresolved external symbol __imp__send@16 referenced in function "public: bool __thiscall Socket::SendData(char *)" (?SendData@Socket@@QAE_NPAD@Z)
1>Socket.obj : error LNK2019: unresolved external symbol __imp__socket@12 referenced in function "public: __thiscall Socket::Socket(void)" (??0Socket@@QAE@XZ)
1>Socket.obj : error LNK2019: unresolved external symbol __imp__WSAStartup@8 referenced in function "public: __thiscall Socket::Socket(void)" (??0Socket@@QAE@XZ)
1>Socket.obj : error LNK2019: unresolved external symbol __imp__WSACleanup@0 referenced in function "public: __thiscall Socket::Socket(void)" (??0Socket@@QAE@XZ)
1>C:\Users\ajayp_000\documents\visual studio 2012\Projects\Client\Debug\Client.exe : fatal error LNK1120: 12 unresolved externals
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
trans by 2020-08-11T20:02:40Z

c-在.so fi中链接到较旧的符号版本

在x86_64 linux上使用gcc和ld,我需要链接到库的较新版本(glibc 2.14),但是可执行文件需要在具有较旧版本(2.5)的系统上运行。 由于唯一不兼容的符号是memcpy(需要memcpy@GLIBC_2.2.5,但是提供memcpy@GLIBC_2.14的库),我想告诉链接器,它应该采用我指定的旧版本,而不是使用memcpy的默认版本。 。

我发现这样做很尴尬:只需在链接器命令行中指定旧.so文件的副本即可。 这可以正常工作,但是我不喜欢将多个.so文件(只能通过指定我链接到的所有旧库才能工作,也有对memcpy的引用)来将其检入svn并由我的构建系统使用的想法 。

因此,我正在寻找一种告诉链接器采用旧版本符号的方法。

对我不起作用的替代方法是:

  • 使用asm .symver(如Trevor Pounds的博客的Web存档中所述),因为这将要求我确保symver位于所有使用memcpy的代码之前,这将非常困难(带有第三方代码的复杂代码库)
  • 使用旧库维护构建环境; 仅仅因为我想在我的桌面系统上进行开发,而在网络中同步内容将是皮塔饼。

考虑链接器的所有工作时,似乎很难实现,毕竟它也有一些代码可以找出符号的默认版本。

只要不像编辑所生成的二进制文件那样怪异的技巧,任何其他与简单链接程序命令行具有相同复杂性级别的想法(例如创建简单的链接脚本等)也将受到欢迎。

编辑:为了保护以后的读者,除了以下思想外,我还为链接器找到了--wrap选项,该选项有时也很有用。

trans by 2020-08-10T23:15:53Z

c ++-获取可执行文件中使用的静态库列表

由于300448181620519831983仅列出了动态库,是否有一种方法可以提取有关用于创建可执行文件的静态库的信息?

trans by 2020-08-10T00:19:36Z

c-...林的多重定义

我定义了一个特殊文件:*.h

我的项目还包含以下文件:

t.c, t.h
pp.c, pp.h
b.c b.h
l.cpp

和#includes:

在t.c中:

    #include "t.h"
    #include "b.h"
    #include "pp.h"
    #include "config.h"

在公元前:

    #include "b.h"
    #include "pp.h"

在pp.c中:

    #include "pp.h"
    #include "config.h"

在l.cpp中:

    #include "pp.h"
    #include "t.h"
    #include "config.h"

我的*.h文件中没有包含指令,只有*.c文件中。 我在config.h中定义了这个:

const char *names[i] =
        {
            "brian", "stefan", "steve"
        };

并需要在l.cpp,t.c,pp.c中使用该数组,但我收到此错误:

pp.o:(.data+0x0): multiple definition of `names'
l.o:(.data+0x0): first defined here
t.o:(.data+0x0): multiple definition of `names'
l.o:(.data+0x0): first defined here
collect2: ld returned 1 exit status
make: *** [link] Error 1

我在项目中使用的每个*.h文件中都包含防护程序。 对解决这个有帮助吗?

trans by 2020-08-09T07:56:37Z

macos-如何在Mac OSX下使用gcc设置可执行文件的运行时路径(-rpath)?

我想在Mac OSX下设置编译时可执行文件(用于链接器)的运行时路径,以便动态链接器在程序启动时找到非标准位置的共享库。

在Linux下,可以通过otool -L(或使用-Wl,-rpath,/path/to)来实现,而在Solaris下,可以将-R/path/to添加到编译器命令行中。

我发现一些信息表明Mac OS X gcc自10.5起(即自2008年以来)具有-rpath支持。

我试图用一个最小的例子来使它工作-没有成功:

$ cat blah.c 
int blah(int b)
{
  return b+1;
}

和:

$ cat main.c 

#include <stdio.h>

int blah(int);

int main ()
{
  printf("%d\n", blah(22));
  return 0;
}

像这样编译:

$ gcc -c  blah.c
$ gcc -dynamiclib blah.o -o libblah.dylib
$ gcc main.c -lblah -L`pwd`  -Xlinker -rpath -Xlinker `pwd`/t

现在测试:

$ mkdir t
$ mv libblah.dylib t
$ ./a.out
dyld: Library not loaded: libblah.dylib
  Referenced from: /Users/max/test/./a.out
  Reason: image not found
Trace/BPT trap

因此出现了问题:如何在Mac OSX下为链接器设置运行时路径?

顺便说一句,设置otool -L可以工作-但我不想使用此技巧。

编辑:关于otool -L

$ otool -L a.out 
a.out:
        libblah.dylib (compatibility version 0.0.0, current version 0.0.0)
        /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 125.2.1)

看来otool -L仅输出可执行文件所链接的库名(以及链接时的位置),而没有输出运行时路径信息。

trans by 2020-08-06T02:48:22Z

链接程序-C ++链接是否足够智能,可以避免未使用的库的链接?

我还没有完全了解C ++链接器的工作方式,对此我有一个具体的问题。

说我有以下几点:

实用程序

namespace Utils
{
    void func1();
    void func2();
}

实用程序

#include "some_huge_lib" // needed only by func2()

namespace Utils
{
    void func1() { /* do something */ }
    void func2() { /* make use of some functions defined in some_huge_lib */ }
}

main.cpp

int main()
{
  Utils::func1()
}

我的目标是生成尽可能小的二进制文件。

我的问题是,将some_huge_lib包含在输出对象文件中吗?

trans by 2020-08-05T07:02:52Z

c-链接器可以内联功能吗?

在文件file1.c中,有一个对在文件file2.c中实现的功能的调用。当我将file1.ofile2.o链接到可执行文件时,如果file2中的函数很小,则链接器会自动检测到该函数很小并内联其调用吗?

trans by 2020-08-03T17:48:26Z

xcode4-Xcode自定义生成配置导致静态库“找不到库/文件”

我有一个带有项目的工作区,该项目与另一个项目(也在工作区中)的静态库链接。 这是Kobold2D中的一个问题,尽管我了解了原因,但我仍无法解决,我想它类似于此问题。

项目目标和静态库目标都具有Debug和Release构建配置。 一切都很好。

现在,有人在项目中添加了一个新的构建配置,并将其命名为Ad-Hoc。 现在,项目的目标建立了Ad-Hoc配置,但是静态库没有这种配置。 显然,他们然后默认创建了Release配置。

最后,当链接程序应该将所有内容组合在一起时,它将失败:

ld: library not found for -lbox2d-ios
Command /Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/clang++ failed with exit code 1

对于通过-force_load $(BUILT_PRODUCTS_DIR)/libSomeLib.a强制加载的库,错误类似,但显示“找不到文件”。 我应该注意,库“ libbox2d-ios.a”在“库的链接二进制文件”构建阶段列表中。

显然,问题在于链接器假定库位于BUILT_PRODUCTS_DIR的Ad-Hoc-iphoneos文件夹中,而实际上却位于Release-iphoneos文件夹中,因为它们没有Ad-Hoc构建配置。

我该如何拍打链接器并告诉他将库放在哪里? 最好是,我正在寻找一种适用于两种情况的解决方案,即库添加了标准方式(链接二进制与库构建阶段)以及需要附加-force_load才能工作的库。

我希望有一些方法可以:

  • 强制将库放置在应用程序目标的构建配置文件夹中
  • 运行后编译和预链接脚本,该脚本将每个库复制到构建配置文件夹
  • 指定库的相对路径
  • 对-force_load使用$ BUILT_PRODUCTS_DIR以外的其他宏
  • 像-WTFmake-all-problems-go-away这样的链接器标志

对不起,但是我不得不说这个……ARGH! :)

trans by 2020-08-03T13:53:26Z

为什么一般程序通常从0x8000开始?

我对Bootloader和系统软件并不陌生,但我不知道通用程序从0x8000开始的原因的起源。我已经知道地址0x8000已被用作普通C / C ++程序的开始地址。

常规程序的引导加载程序的最小大小是否占用0x8000? 还是应该分配给引导加载程序的ROM最小块大小为32KB? 还是还有其他原因?

我想从虚拟地址的角度,从历史或逻辑上了解这一点。


感谢您的宝贵时间,并为此提供帮助。为了使问题更清楚,问题与虚拟地址有关,与物理地址无关。

从物理内存地址的角度来看,我基本上同意R的观点。

不用说特定的系统,例如linux(甚至在android中),通用的RTOS(内核,以及其他,尤其是ARM链接器部分),它们都使用地址0x8000作为通用程序的起始地址。在此区域中存在诸如0x0且带有加载程序的名为crt_begin.o,crt.o等的文件。

因此,考虑到块大小(如果它将在引导时间(冷启动)位于BootROM中),我认为一般程序的引导程序的最小大小为32KB。

嗯,但我不确定...

trans by 2020-08-02T13:29:49Z

模板方法的未定义引用错误

这个问题已经在这里有了答案:

  • 为什么只能在头文件中实现模板? 16个答案

在过去的一个半小时中,这一直使我发疯。 我知道这是一件小事,但是找不到问题所在(当然,这是一个下雨的星期五下午的事实,无济于事)。

我定义了以下类,该类将保存从文件中读取的配置参数,并允许我从程序中访问它们:

class VAConfig {
    friend std::ostream& operator<<( std::ostream& lhs, const VAConfig& rhs);

private:
    VAConfig();
    static std::string      configFilename;
    static VAConfig*        pConfigInstance;
    static TiXmlDocument*   pXmlDoc;
    std::map<std::string, std::string> valueHash;

public:
    static VAConfig* getInstance();
    static void setConfigFileName( std::string& filename ) { configFilename = filename; }
    virtual ~VAConfig();

    void readParameterSet( std::string parameterGroupName );
    template<typename T> T readParameter( const std::string parameterName );
    template<typename T> T convert( const std::string& value );
};

其中方法undefined reference to 'int VAConfig::convert<int>...'readParameter()中定义为

template <typename T>
T VAConfig::convert( const std::string& value )
{
    T t;
    std::istringstream iss( value, std::istringstream::in );
    iss >> t;
    return t;
}

一切都非常简单。 但是当我使用我的主程序进行测试时

int y = parameters->convert<int>("5");

我收到undefined reference to 'int VAConfig::convert<int>...'编译错误。 同上readParameter()

看了很多模板教程,但无法弄清楚。 有任何想法吗?

trans by 2020-07-29T16:28:55Z

链接程序-函数上的C ++ extern关键字。 为什么不只包含头文件?

如果我正确理解,这意味着

extern void foo();

函数foo在另一个转换单元中声明。

1)为什么不只是#include声明此函数的标头?

2)链接器如何知道链接时在哪里寻找功能?

编辑:也许我应该澄清一下,然后使用函数

foo();

在此翻译单元中从未定义过它。

trans by 2020-07-23T22:22:16Z

链接器-在g中同时使用静态和动态链接库

我需要分发一个可以在尽可能多的x86 Linux发行版上运行的二进制文件。 这意味着我必须静态链接某些库,例如glibc,因为用户可能没有我使用的版本。 必须动态链接其他库,例如fontconfig,因为它依赖于缓存文件格式和每个系统上可能不同的硬编码位置。

有哪些命令行选项可以执行此操作? 如果我指定-static,那么gcc将完全拒绝动态链接任何库。

trans by 2020-07-23T19:05:23Z

ld-KEEP在链接描述文件中是什么意思?

LD手册没有解释KEEP命令的作用。 以下是来自第三方链接器脚本的摘要,其特征为KEEPKEEP命令在ld中做什么?

SECTIONS
{  
    .text :
    {
        . = ALIGN(4);
        _text = .;
        PROVIDE(stext = .);
        KEEP(*(.isr_vector))
        KEEP(*(.init))
        *(.text .text.*)        
        *(.rodata .rodata.*)        
        *(.gnu.linkonce.t.*)
        *(.glue_7)
        *(.glue_7t)
        *(.gcc_except_table)
        *(.gnu.linkonce.r.*)
        . = ALIGN(4);
        _etext = .;
        _sidata = _etext;
        PROVIDE(etext = .);   
            _fini = . ;
                *(.fini)

    } >flash
trans by 2020-07-22T00:31:54Z

c-为什么我的编译防护程序不能防止多个定义包含?

我有一个头文件x.h,其中包含多个* .c源文件。该头文件定义了一些结构变量。

我在头文件的开头放置了多个防止包含的防护措施,如下所示:

#ifndef X_H
#define X_H
...
..
//header file declarations and definitons.


#endif//X_H

在构建过程中,我得到与多个定义有关的链接器错误。 我了解这个问题。

  1. 是否不会像我一样在头文件的顶部使用防止多重包含的防护措施,防止头文件x.h的多重包含,从而避免对x.h中存在的变量进行多次定义?

  2. #pragma曾经无法在此特定编译器上运行,那么解决方案是什么?有人将这个答案发布到了类似的问题上。 它似乎对我不起作用。 这个解决方案如何运作?

trans by 2020-07-11T00:13:42Z

链接器-链接共享库时限制符号的可见性

某些平台要求您向链接器提供共享库的外部符号列表。 但是,在大多数unixish系统上,这不是必需的:默认情况下,所有非静态符号都将可用。

我的理解是,GNU工具链可以选择性地将可见性限制为明确声明的符号。 如何使用GNU ld来实现?

trans by 2020-07-09T23:20:57Z

类静态constexpr的C ++链接器错误

我正在使用g++编译以下简单程序:

#include <algorithm>

struct S
{
    static constexpr int X = 10;
};

int main()
{
    return std::min(S::X, 0);
};

我收到以下链接器错误:

/tmp/ccBj7UBt.o: In function `main':
scratch.cpp:(.text+0x17): undefined reference to `S::X'
collect2: ld returned 1 exit status

我意识到,内联定义的静态成员没有定义符号,但是我的印象(可能是有缺陷的)是,使用g++告诉编译器始终将符号视为表达式。 因此,编译器会知道传递对符号S::X的引用是不合法的(出于相同的原因,您不能对文字10进行引用)。

但是,如果将S声明为名称空间,即“名称空间S”而不是“结构S”,则所有链接都可以正常运行。

这是g++的错误,还是我仍然需要使用技巧来解决此烦恼?

trans by 2020-07-09T00:42:16Z

haskell-ghc编译的二进制文件需要GHC还是自包含的?

如果一个朋友想要运行我的Haskell二进制文件,他是否必须先安装Haskell,还是可以立即单独运行二进制文件?

在Mac,Windows和Linux上答案是否相同?

trans by 2020-07-05T17:35:14Z

gcc-非常奇怪的链接器行为

这很奇怪,因为通过删除对libm的引用,我能够解决以下错误。

gcc -o example example.o -Wl -L/home/kensey/cdev/lib -L/usr/lib/x86_64-linux-gnu   -lmysqlclient -lpthread -lz -L/usr/lib/x86_64-linux-gnu -lm -lrt -ldl -lcdev -L/home/kensey/www.tools/gplot-lib -lgplot -L/home/kensey/www.tools/gd1_3ret -lgd -lxml2 -lcurl
/usr/bin/ld: /home/kensey/www.tools/gplot-lib/libgplot.a(set.o): undefined reference to symbol 'floor@@GLIBC_2.2.5'
/usr/bin/ld: note: 'floor@@GLIBC_2.2.5' is defined in DSO /usr/lib/x86_64-linux-gnu/libm.so so try adding it to the linker command line
/usr/lib/x86_64-linux-gnu/libm.so: could not read symbols: Invalid operation
collect2: ld returned 1 exit status

因此,如果删除命令的-lm部分,则不会收到错误消息。 但是,我想知道是否有人知道为什么删除对所需库的引用会解决此问题。 链接器如何知道要查看的库? 另外-有没有办法查询生成的可执行文件并说“您将引用解析为哪个库”? 显然,发生了一些我不了解的事情,这困扰着我...

trans by 2020-07-04T07:17:03Z

1 2 3 4 5 下一页 共5页