./libmylib.so:未定义的"submarinex::LIB::kCount"

./libmylib.so: undefined reference to `submarinex::LIB::kCount'

本文关键字:submarinex LIB kCount 未定义 libmylib so      更新时间:2023-10-16

我在目录中有3个文件。我将构建ll.cclibmylib.so,然后将main.cc构建为myexe

使用这些命令构建

g++ -Wall -g -fPIC -std=c++11 ll.cc -shared -o libmylib.so
g++ -Wall -g -std=c++11 main.cc -L. -lmylib -o myexe

但是,G 报告构建myexe时的错误:

./libmylib.so: undefined reference to `submarinex::LIB::kCount'
collect2: error: ld returned 1 exit status

文件:

ll.h

namespace submarinex {
class LIB {
 public:
  void Print();
 private:
  static const int kCount = 100;
};
}  // namespace submarinex

ll.cc

#include "ll.h"
#include <algorithm>
#include <iostream>
namespace submarinex {
void LIB::Print() {
  int min = std::min(101, kCount);
  std::cout << min << std::endl;
  // std::cout << kCount << std::endl;
}
}  // namespace submarinex

main.cc

#include "ll.h"
int main(int argc, char **argv) {
  submarinex::LIB lib;
  lib.Print();
  return 0;
}

Case 1:如果在Print中使用这2行,则将在main.cc

的链接对象时报告错误
  int min = std::min(101, kCount);
  std::cout << min << std::endl;

Case 2:如果在Print中使用此行,将成功

  std::cout << kCount << std::endl;

如果更改

 static const int kCount = 100;

to

 const int kCount = 100;

无论使用Case1Case2

,都可以

我不知道如何解决这个问题。

我认为您的源代码中的kcount变量没有定义。

因此,您的变量必须在源代码中的某个地方定义,ll.cc。

在ll.h

namespace submarinex {
    class LIB {
        private:
            const static int kCount =100;
        public:
            void Print();
    };
}  // namespace submarinex

然后,您可以在ll.cc

中定义一个kcount变量
#include "ll.h"
#include <algorithm>
#include <iostream>
namespace submarinex 
{
    const int LIB::kCount; //<== here
    void LIB::Print() {
        int min = std::min(101, kCount);
        std::cout << min << std::endl;
        // std::cout << kCount << std::endl;
    }   
}  // namespace submarinex

这是我的GCC版本信息

$ gcc -v
Using built-in specs.
COLLECT_GCC=C:DEVCOMPmsys32mingw32bingcc.exe
COLLECT_LTO_WRAPPER=C:/DEV/COMP/msys32/mingw32/bin/../lib/gcc/i686-w64-mingw32/6.3.0/lto-wrapper.exe
Target: i686-w64-mingw32
Configured with: ../gcc-6.3.0/configure --prefix=/mingw32 --with-local-prefix=/mingw32/local --build=i686-w64-mingw32 --host=i686-w64-mingw32 --target=i686-w64-mingw32 --with-native-system-header-dir=/mingw32/i686-w64-mingw32/include --libexecdir=/mingw32/lib --enable-bootstrap --with-arch=i686 --with-tune=generic --enable-languages=c,lto,c++,objc,obj-c++,fortran,ada --enable-shared --enable-static --enable-libatomic --enable-threads=posix --enable-graphite --enable-fully-dynamic-string --enable-libstdcxx-time=yes --disable-libstdcxx-pch --disable-libstdcxx-debug --disable-isl-version-check --enable-lto --enable-libgomp --disable-multilib --enable-checking=release --disable-rpath --disable-win32-registry --disable-nls --disable-werror --disable-symvers --with-libiconv --with-system-zlib --with-gmp=/mingw32 --with-mpfr=/mingw32 --with-mpc=/mingw32 --with-isl=/mingw32 --with-pkgversion='Rev1, Built by MSYS2 project' --with-bugurl=https://sourceforge.net/projects/msys2 --with-gnu-as --with-gnu-ld --disable-sjlj-exceptions --with-dwarf2
Thread model: posix
gcc version 6.3.0 (Rev1, Built by MSYS2 project)

用mingw32 shell编译。

g++ -Wall -g -fPIC -std=c++11 -I. ll.cc -shared -o libmylib.a
g++ -Wall -g -std=c++11 -I. -L. -lmylib main.cc -o myexe

我希望这对您有帮助。

问:

std::min使用两个params const int&(不是 int),然后将引用传递给没有定义的submarinex::LIB::kCount(您只是在.h文件中声明)。

>

在这种情况下,您可以在ll.cc

中添加此行
namespace submarinex {
    static const int LIB::kCount = 100; //define it here
    void LIB::Print() {
        std::min(101, kCount);
    }
}