2016-12-29 3 views
0

내 프로젝트에 CMake 빌드 시스템을 사용하고 있습니다.gcc/g ++ 대체 정의

getenv("MYPROJDIR") 

하지만 난 후에도 지속적인 변수를 만들려하지 않습니다

나는 항상 프로젝트 디렉토리를 알고 내 프로그램의 실행 파일, 내가 내가 환경 변수 및 사용을 설정할 수 있다고 생각합니다 시스템, 나는 수동으로 내 프로그램을 실행하기 전에 매번 임시 변수를 생성하고 싶지 않다.

내 소스가 프로젝트 디렉토리를 알 수 있도록 빌드 시간에 일부 변수를 설정하는 방법이 있으며 실행되는 위치에 관계없이 해당 디렉토리를 기준으로 입력 파일에 액세스 할 수 있습니다.

나는 -D 스위치를 정의하거나 사용할 수 :

add_definitions(-DMYPROJDIR=${PROJECT_SOURCE_DIR}) 

을하지만 난 사람들이 절대적으로 필요한 경우가 아니라면 매크로를 사용하지 않는 말을 들었습니다.

은 전반적으로 나는이 funtionality 필요

const string defaultinput = MYPROJDIR + "src/someinputdata.dat" 
ifstream myfile(defaultinput) 
+0

,값. 그리고 당신이 원하는 프로젝트 디렉토리를 놓습니다. 또 다른 가능성은이 경로를 응용 프로그램의 인수로 전달하는 것입니다. – johngull

+0

매크로가 그렇게 나쁜 생각은 아닙니다. 그러나보다 융통성을 원한다면 런타임에 실행 파일의 경로를 찾아 데이터 파일을로드 할 수 있습니다. 즉, 두 디렉토리를 다른 디렉토리로 이동하고 작업을 계속 수행 할 수 있습니다. – Olivier

+0

정말 나쁜 생각입니다. 응용 프로그램을 다른 컴퓨터에 배포하거나 복사 할 때 수행 할 작업은 무엇입니까? 이 새 컴퓨터의 파일에 액세스하는 방법을 어떻게 알 수 있습니까? – SergeyA

답변

2

을하지만 난 사람들이 매크로를 사용하지 않는 말을 들었습니다 절대적으로 필요한 경우가 아니면.

사실 일지라도 -D 스위치를 사용하는 것이 매크로라고 말하지 않습니다.

-D 스위치를 사용하면 코드에 빌드 타임 변수를 추가 할 수 있습니다. 당신이 원하는 것 같습니다.

+1

@Vikash 더 좋은 방법은 없습니다. 이 기능이 필요한 몇 가지 유스 케이스 중 하나 인 경우'-D'도 사용합니다. 그러나 꽤 많은 구성 매개 변수 (예를 들어 20 개)가 있으면 CMake가 구성한 구성 헤더가 장기적으로 더 나은 옵션이됩니다. – everclear

0

정의의 대안은 사용 사례에 따라 다릅니다. 빌드/컴파일 시간에 대한 가장 확실한 대안은 런타임 결정입니다.

귀하의 경우 프로그램의 대상에 절대 경로를 프로그램 자체에 넣는 것이 좋습니다 (@SergeyA 주석 참조).

나는 다음과 같은 두 개의 런타임 솔루션 중 하나 추천 할 것입니다 : 그럼 난 것,이 정말 응용 프로그램의 일부가 될해야 할 데이터의 경우

  1. 을 (1 개 관계 일을 하드 코딩) 아마 직접 프로그램에 src/someinputdata.dat의 내용을 컴파일

  2. 일부 프로그램 코드를 통해 실행 파일의 경로를 가져옵니다 당신이 다른 쌍의 이름으로 자원의 일부 구성 파일을 만들 수 있습니다 귀하의 경우