First define the function normally: g[y_] := y^2; Then substitute the definition in: f = ReleaseHold[Hold[Compile[{{x, _Real}}, g[x], CompilationTarget -> "C"]] /. DownValues[g]] And there is no longer `MainEvaluate`in the compiled function. As Oleksandr R. suggested, you can also do g = #^2 &; f = Compile[{{x, _Real}}, g[x], CompilationTarget -> "C", CompilationOptions -> {"InlineExternalDefinitions" -> True}]