소스에서 빌드하는 경우 저는 초보자라는 점을 명심하세요(몇 번 시도했지만 거의 항상 실패함).
Ubuntu 19를 실행하는 Raspberry Pi 3b용 MySQL Connector/C++ 8을 빌드하려고 합니다. 나는 팔로우한다공식 설명모든 필수 구성 요소를 설치했습니다( codecvt_utf8
존재 여부가 100% 확실하지 않음).
내 빌드는 JDBC 및 BOOST를 사용하지 않습니다. 소스에서 OpenSSL 1.1.1을 구축했습니다.
내가 실행 중인 명령( --target install
직접 추가했는데 이것이 문제인지 확실하지 않음):
cmake .
cmake --build . --target install --config Release
AFAIK 다음과 같은 이유로 실패했습니다.
CMakeFiles/CMakeTmp/CheckIncludeFile.c:1:10: 치명적인 오류: sys/endian.h: 해당 파일 또는 디렉터리가 없습니다.
CMakeFiles/CMakeTmp/CheckIncludeFile.c:1:10: 치명적인 오류: sys/byteorder.h: 해당 파일 또는 디렉터리가 없습니다.
확인해 보니 /usr/include
디렉토리가 없습니다 sys
. endian.h
바로 위에 있으며 전혀 byteorder.h
존재하지 않습니다.
일부 파일이 누락된 이유는 무엇입니까?
상술 한 바와 같이여기, sys
우분투의 다른 위치에 있습니다. 그래서 나는 이것을 실행했습니다 :
ln -s /usr/include/aarch64-linux-gnu/sys /usr/include/sys
그러나 누락된 파일은 실제로 해당 디렉토리에도 없습니다.
달리기
find /usr/include -type f -name endian.h
find /usr/include -type f -name byteorder.h
이 파일은 실제로 및 에 있습니다 /usr/include/aarch64-linux-gnu/bits/endian.h
. /usr/include/aarch64-linux-gnu/asm/byteorder.h
링크해야 합니까? 나쁜 생각인 것 같습니다.
전체 출력(캐시된 진행률 사용):
[ 2%] Built target uuid_gen
[ 4%] Building protobuf
[ 27%] Built target protobuf-lite
[ 28%] Building CXX object CMakeFiles/protobuf.dir/protobuf-3.6.1/src/google/protobuf/descriptor.cc.o
c++: fatal error: Killed signal terminated program cc1plus
compilation terminated.
make[5]: *** [CMakeFiles/protobuf.dir/build.make:115: CMakeFiles/protobuf.dir/protobuf-3.6.1/src/google/protobuf/descriptor.cc.o] Error 1
make[4]: *** [CMakeFiles/Makefile2:73: CMakeFiles/protobuf.dir/all] Error 2
make[3]: *** [Makefile:84: all] Error 2
make[2]: *** [cdk/CMakeFiles/build_protobuf.dir/build.make:58: cdk/protobuf/build.stamp] Error 2
make[1]: *** [CMakeFiles/Makefile2:297: cdk/CMakeFiles/build_protobuf.dir/all] Error 2
make: *** [Makefile:130: all] Error 2
전체 오류 로그:
Performing C++ SOURCE FILE Test HAVE_IS_SAME failed with the following output:
Change Dir: /home/ubuntu/mysql-connector-c++-8.0.18-src/CMakeFiles/CMakeTmp
Run Build Command:"/usr/bin/make" "cmTC_dadf7/fast"
/usr/bin/make -f CMakeFiles/cmTC_dadf7.dir/build.make CMakeFiles/cmTC_dadf7.dir/build
make[1]: Entering directory '/home/ubuntu/mysql-connector-c++-8.0.18-src/CMakeFiles/CMakeTmp'
Building CXX object CMakeFiles/cmTC_dadf7.dir/src.cxx.o
/usr/bin/c++ -DHAVE_IS_SAME -std=c++11 -o CMakeFiles/cmTC_dadf7.dir/src.cxx.o -c /home/ubuntu/mysql-connector-c++-8.0.18-src/CMakeFiles/CMakeTmp/src.cxx
/home/ubuntu/mysql-connector-c++-8.0.18-src/CMakeFiles/CMakeTmp/src.cxx:1:1: error: ‘::main’ must return ‘int’
1 | void main() { return is_same<bool,char>::value; }
| ^~~~
/home/ubuntu/mysql-connector-c++-8.0.18-src/CMakeFiles/CMakeTmp/src.cxx: In function ‘int main()’:
/home/ubuntu/mysql-connector-c++-8.0.18-src/CMakeFiles/CMakeTmp/src.cxx:1:22: error: ‘is_same’ was not declared in this scope
1 | void main() { return is_same<bool,char>::value; }
| ^~~~~~~
/home/ubuntu/mysql-connector-c++-8.0.18-src/CMakeFiles/CMakeTmp/src.cxx:1:30: error: expected primary-expression before ‘bool’
1 | void main() { return is_same<bool,char>::value; }
| ^~~~
/home/ubuntu/mysql-connector-c++-8.0.18-src/CMakeFiles/CMakeTmp/src.cxx:1:30: error: expected ‘;’ before ‘bool’
1 | void main() { return is_same<bool,char>::value; }
| ^~~~
| ;
/home/ubuntu/mysql-connector-c++-8.0.18-src/CMakeFiles/CMakeTmp/src.cxx:1:34: error: expected unqualified-id before ‘,’ token
1 | void main() { return is_same<bool,char>::value; }
| ^
/home/ubuntu/mysql-connector-c++-8.0.18-src/CMakeFiles/CMakeTmp/src.cxx:1:35: error: expected unqualified-id before ‘char’
1 | void main() { return is_same<bool,char>::value; }
| ^~~~
make[1]: *** [CMakeFiles/cmTC_dadf7.dir/build.make:66: CMakeFiles/cmTC_dadf7.dir/src.cxx.o] Error 1
make[1]: Leaving directory '/home/ubuntu/mysql-connector-c++-8.0.18-src/CMakeFiles/CMakeTmp'
make: *** [Makefile:121: cmTC_dadf7/fast] Error 2
Source file was:
void main() { return is_same<bool,char>::value; }
Determining if the include file sys/endian.h exists failed with the following output:
Change Dir: /home/ubuntu/mysql-connector-c++-8.0.18-src/CMakeFiles/CMakeTmp
Run Build Command:"/usr/bin/make" "cmTC_a570b/fast"
/usr/bin/make -f CMakeFiles/cmTC_a570b.dir/build.make CMakeFiles/cmTC_a570b.dir/build
make[1]: Entering directory '/home/ubuntu/mysql-connector-c++-8.0.18-src/CMakeFiles/CMakeTmp'
Building C object CMakeFiles/cmTC_a570b.dir/CheckIncludeFile.c.o
/usr/bin/cc -o CMakeFiles/cmTC_a570b.dir/CheckIncludeFile.c.o -c /home/ubuntu/mysql-connector-c++-8.0.18-src/CMakeFiles/CMakeTmp/CheckIncludeFile.c
/home/ubuntu/mysql-connector-c++-8.0.18-src/CMakeFiles/CMakeTmp/CheckIncludeFile.c:1:10: fatal error: sys/endian.h: No such file or directory
1 | #include <sys/endian.h>
| ^~~~~~~~~~~~~~
compilation terminated.
make[1]: *** [CMakeFiles/cmTC_a570b.dir/build.make:66: CMakeFiles/cmTC_a570b.dir/CheckIncludeFile.c.o] Error 1
make[1]: Leaving directory '/home/ubuntu/mysql-connector-c++-8.0.18-src/CMakeFiles/CMakeTmp'
make: *** [Makefile:121: cmTC_a570b/fast] Error 2
Determining if the include file sys/byteorder.h exists failed with the following output:
Change Dir: /home/ubuntu/mysql-connector-c++-8.0.18-src/CMakeFiles/CMakeTmp
Run Build Command:"/usr/bin/make" "cmTC_e560b/fast"
/usr/bin/make -f CMakeFiles/cmTC_e560b.dir/build.make CMakeFiles/cmTC_e560b.dir/build
make[1]: Entering directory '/home/ubuntu/mysql-connector-c++-8.0.18-src/CMakeFiles/CMakeTmp'
Building C object CMakeFiles/cmTC_e560b.dir/CheckIncludeFile.c.o
/usr/bin/cc -o CMakeFiles/cmTC_e560b.dir/CheckIncludeFile.c.o -c /home/ubuntu/mysql-connector-c++-8.0.18-src/CMakeFiles/CMakeTmp/CheckIncludeFile.c
/home/ubuntu/mysql-connector-c++-8.0.18-src/CMakeFiles/CMakeTmp/CheckIncludeFile.c:1:10: fatal error: sys/byteorder.h: No such file or directory
1 | #include <sys/byteorder.h>
| ^~~~~~~~~~~~~~~~~
compilation terminated.
make[1]: *** [CMakeFiles/cmTC_e560b.dir/build.make:66: CMakeFiles/cmTC_e560b.dir/CheckIncludeFile.c.o] Error 1
make[1]: Leaving directory '/home/ubuntu/mysql-connector-c++-8.0.18-src/CMakeFiles/CMakeTmp'
make: *** [Makefile:121: cmTC_e560b/fast] Error 2
cmake 3.13.4g
++ 9.2.1
openssl 1.1.1d
답변1
C++ 컴파일러에 메모리가 부족한 것 같습니다. make를 사용하여 빌드할 때 스레드 1개를 지정해 보세요. 예를 들면 다음과 같습니다.
$ cd path/to/connector/source
$ mkdir build && cd build
$ cmake .. -DCMAKE_BUILD_TYPE=Release
$ make -j1
(이것은 ... 불리운다"출처 없음"세워두다)
그래도 실패하고 Pi에 여전히 메모리가 충분하지 않은 경우 raspi-config
도구(루트로 실행)를 사용하여 Pi의 메모리 할당을 조정하여 GPU에 가능한 한 적게 할당하고 그래픽 로그인을 비활성화하여 메모리 양을 늘려보세요. 컴파일을 위해 메모리를 확보하세요. 그런 다음 변경 사항을 적용하려면 재부팅한 다음 콘솔에서 원하는 대로 빌드하세요. 모든 것이 순조롭게 진행되면 raspi-config
이를 다시 사용하여 이전에 수정한 설정을 원래 값으로 다시 조정할 수 있습니다. 실패하면 메모리가 더 많은 다른 Linux 시스템에서 크로스 컴파일하는 것을 고려할 수 있습니다. Pi용 크로스 컴파일 툴체인을 구축 crosstool-ng
한 다음 이를 사용하여 CMake 프로젝트를 구축하는 방법에 대한 가이드는 여기에서 찾을 수 있습니다.https://blog.kitware.com/cross-compiling-for-raspberry-pi/.