<div dir="ltr"><span style="font-family:arial,sans-serif;font-size:13px">The way I implemented separable compilation it doesn&#39;t use nvcc to link.  It relies on the host compiler to do the linking.  I&#39;m not sure at first blush why you are having this problem.  One thing that should probably be done is to change this line of code in FindCUDA.cmake:</span><div style="font-family:arial,sans-serif;font-size:13px">

<br></div><div style="font-family:arial,sans-serif;font-size:13px"><div>    # For now we are ignoring all the configuration specific flags.</div><div>    set(nvcc_flags)</div><div>    CUDA_PARSE_NVCC_OPTIONS(nvcc_flags ${options})</div>

</div><div style="font-family:arial,sans-serif;font-size:13px"><br></div><div style="font-family:arial,sans-serif;font-size:13px"><br></div><div style="font-family:arial,sans-serif;font-size:13px">To this to pass the CUDA_NVCC_FLAGS in.</div>

<div style="font-family:arial,sans-serif;font-size:13px"><br></div><div style="font-family:arial,sans-serif;font-size:13px"><div>    # For now we are ignoring all the configuration specific flags.</div><div>    set(nvcc_flags ${CUDA_NVCC_FLAGS})</div>

<div>    CUDA_PARSE_NVCC_OPTIONS(nvcc_flags ${options})</div></div></div><div class="gmail_extra"><br><br><div class="gmail_quote">On Mon, Dec 16, 2013 at 2:25 PM, MARTIN, ROBERT S CTR USAF AFMC AFRL/RQRS <span dir="ltr">&lt;<a href="mailto:robert.martin.81.ctr@us.af.mil" target="_blank">robert.martin.81.ctr@us.af.mil</a>&gt;</span> wrote:<br>

<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">CMake Group-<br>
<br>
I&#39;m trying to build a CUDA project with NVCC.  The project uses &#39;separate<br>
compilation&#39;.  Unfortunately, &#39;separate compilation&#39; breaks in a variety of<br>
ways when I try to use the version in FindCUDA.cmake.  First, it doesn&#39;t<br>
include CUDA_NVCC_FLAGS in the -dlink phase so it immediately complains that<br>
the dlink flag can&#39;t be used without sm_20+.  That has already been noted as<br>
a bug (<a href="http://public.kitware.com/Bug/view.php?id=14238" target="_blank">http://public.kitware.com/Bug/view.php?id=14238</a>) and there seems to<br>
be some discussion about it being inappropriate to default to some sm_<br>
version.  Since multiple sm_ options can be listed but only one arch flag,<br>
it seems like this may need a more advanced way to be dealt with.  Anyway,<br>
after modifying things to add a -arch=sm_20 to the command line, it works<br>
for a while but then cannot dlink one of my objects because of:<br>
&#39;nvlink error :  Undefined reference to &#39;_Z3minRK6float3S1_&#39; in &#39;(..some<br>
path...)_generated_(...some file...).cu.o&#39;<br>
<br>
 I can&#39;t find this problem because I don&#39;t really understand function name<br>
mangling, but it looks like it cannot link to a &#39;min&#39; function probably.<br>
It&#39;s not one of the &quot;__cudaRegisterLinkedBinary...&quot; type issues though, and<br>
so I&#39;m not clear why nvlink is trying to resolve all the symbols for an<br>
intermediate object anyway.<br>
<br>
As a workaround for all this, I tried adding &#39;-dc&#39; to the normal compiles<br>
and linking with nvcc instead of gcc so that nvcc can do device and host<br>
linking in one pass.<br>
(<a href="http://docs.nvidia.com/cuda/cuda-compiler-driver-nvcc/index.html#using-sepa
rate-compilation-in-cuda" target="_blank">http://docs.nvidia.com/cuda/cuda-compiler-driver-nvcc/index.html#using-sepa<br>
rate-compilation-in-cuda</a> ... &quot;nvcc &lt;objects&gt;&quot;).  This almost works except<br>
for a few link command line incompatibilities.  First, nvcc doesn&#39;t know<br>
what to do with &#39;-Wl,-rpath...&#39;.  It needs some &#39;-Xlinker&#39; in front of that<br>
to know where to send it.  I can get around that by just turning off rpath<br>
with &#39;set(CMAKE_SKIP_RPATH TRUE)&#39;, but it&#39;s not a great solution.    I also<br>
have to remove the &#39;-rdynamic&#39; flag by setting<br>
CMAKE_SHARED_LIBRARY_LINK_CXX_FLAGS to nothing (&quot;&quot;). The last issue is that<br>
for some reason on some machines CMake tries to use full paths for shared<br>
libraries rather than -l &amp; -L and nvcc chokes on the extension (static<br>
libraries with .a are fine).   The error message is:<br>
<br>
Nvlink fatal   : Unsupported file type &#39;/usr/lib/openmpi/lib/libmpi_cxx.so&#39;<br>
<br>
If I replace the &#39;/usr/lib/openmpi/lib/libmpi_cxx.so&#39; with<br>
&#39;-L/usr/lib/openmpi/lib/ -lmpi_cxx&#39;, it works.  When I look at the ldd<br>
output, it&#39;s even correctly still linking to the .so (rather than a static<br>
library).  Interestingly enough, on a different machine with a similar setup<br>
the FindMPI module adds the &#39;-L -l&#39; options instead of the full path (mpich<br>
instead of openmpi though?).  I found this page on the cmake wiki that<br>
suggests getting rid of &#39;-L/-l&#39; as an &#39;improvement&#39;:<br>
<a href="http://www.cmake.org/Wiki/CMake:Improving_Find*_Modules#Converting_-L.2F-l_f" target="_blank">http://www.cmake.org/Wiki/CMake:Improving_Find*_Modules#Converting_-L.2F-l_f</a><br>
lags<br>
<br>
Is this currently an encouraged approach?  Is there a way to control the<br>
behavior in cmake to force CMake to choose using &#39;-L/-l&#39; instead of full<br>
paths?  I realize this could also be considered more of a bug with nvlink<br>
than with cmake, but I figured I could try to start here.  It would be a<br>
simple enough regular expression to break the full path into the two pieces,<br>
but I&#39;m pretty new to CMake and I&#39;m not sure how this could be accomplished.<br>
If I could just get control of this behavior, I&#39;d have something that would<br>
work for now until FindCUDA can get sorted out a little more with respect to<br>
all the CUDA 5+ changes and/or more tightly integrated into CMake like other<br>
compilers tend to be.<br>
<br>
Thanks for any help people can provide.<br>
<br>
<br>
<br>
<br>
<br>
Robert Martin, ERC Inc.<br>
EP Modeling and Simulation Group<br>
In-Space Propulsion Branch<br>
Air Force Research Laboratory<br>
<a href="tel:661-275-6659" value="+16612756659">661-275-6659</a><br>
<br>
<br>--<br>
<br>
Powered by <a href="http://www.kitware.com" target="_blank">www.kitware.com</a><br>
<br>
Please keep messages on-topic and check the CMake FAQ at: <a href="http://www.cmake.org/Wiki/CMake_FAQ" target="_blank">http://www.cmake.org/Wiki/CMake_FAQ</a><br>
<br>
Kitware offers various services to support the CMake community. For more information on each offering, please visit:<br>
<br>
CMake Support: <a href="http://cmake.org/cmake/help/support.html" target="_blank">http://cmake.org/cmake/help/support.html</a><br>
CMake Consulting: <a href="http://cmake.org/cmake/help/consulting.html" target="_blank">http://cmake.org/cmake/help/consulting.html</a><br>
CMake Training Courses: <a href="http://cmake.org/cmake/help/training.html" target="_blank">http://cmake.org/cmake/help/training.html</a><br>
<br>
Visit other Kitware open-source projects at <a href="http://www.kitware.com/opensource/opensource.html" target="_blank">http://www.kitware.com/opensource/opensource.html</a><br>
<br>
Follow this link to subscribe/unsubscribe:<br>
<a href="http://www.cmake.org/mailman/listinfo/cmake" target="_blank">http://www.cmake.org/mailman/listinfo/cmake</a><br></blockquote></div><br></div>