# mac m1(arm64)에서 linux/x86(amd64) 환경 cpp 개발을 위해,
# 다음과 같이 docker 를 띄우고 host cpp 소스 경로 <-> docker볼륨을 연결했다.
docker run -dit --name myproject \
--hostname myproject-docker \
--platform linux/amd64 \
--workdir /myproject \
-p 8080:8080 \
-p 8081:8081 \
-v /Users/ysoftman/myproject:/myproject \
-v /Users/ysoftman/myproject_lib:/myproject_lib \
ysoftman-myproject
# 빌드는 docker 에서 수행하도록 했다.
docker exec -u root -it myproject /bin/bash -c "
cd /myproject &&
cmake \
-DEXTERNS_DIR:PATH=/myproject_lib \
-DCMAKE_INSTALL_PREFIX:PATH=/myproject/out
make -j8 && make install
"
# host 에서 cpp 를 nvim 으로 열면 다음과 같이 선어되지 않은 식별자 에러가 발생한다.
clang "use of undeclared identifier"
# 참고로 vscode 는 자체 cpp intelligence 를 이용해서 에러가 없다.
# 원인은 nvim cpp LSP(LanguageServerProtocol) 로 clangd(clang 데몬)를 사용하고
# clangd 는 식별자 선언 내용을 compile_commands.json 파일을 참고하는데 이 파일이 없었다.
# 다음의 cmake 명령으로 compile_commands.json 을 생성할 수 있다.
cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=ON {프로젝트 경로}
# 문제
# 다음과 같이 host 기준으로 하면 이미 makefile, cmakecahe.txt 등의 파일들이 docker container 기준의 경로로 되어 있기 때문에 에러가 발생한다.
cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=ON /Users/ysoftman/myproject
# 그리고 mac 루트 경로에서는 읽기만 허용해 다음과 같은 소프트 링크를 생성할 수 없었다.
ln -sf /myproject -> /Users/ysoftman/myproject
# 해결방법
# docker container 환경에서 compile_commands.json 생성하고
docker exec -u root -it myproject /bin/bash -c "
cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=ON /myproject
"
# mac root 경로를 수정할 수 없어 compile_commands.json 의 경로를 수정한다.
pushd /Users/ysoftman/myproject
sed -i '' \
-e "s#/myproject#$/Users/ysoftman/myproject#g" \
-e "s#/myproject_lib#$/Users/ysoftman/myproject_lib#g" \
compile_commands.json
popd
# 이제 nvim 으로 열어보면 에러도 없고 goto declaration도 잘 동작한다.
comments:
댓글 쓰기